Hello Procedure


/*
 * Programa para escrever "Hello Procedure".
 * Tamanho da mensagem calculado numa procedure.
 */

.equ	SYS_EXIT, 1
.equ	SYS_WRITE, 4
.equ	STDIN, 0
.equ	STDOUT, 1

.data
.align 4

mensagem:	.asciz	"Hello Procedure\n"	// Mensagem a ser exibida

.text
.global _start

msgsize:			// Calcular o tamanho da mensagem e retornar em R2.
	PUSH	{R1, LR}	// Salvar R1 e LR (Link Register) na pilha.
	MOV	R2, #0		// Inicializar tamanho da mensagem em R2 (zero).
loop:	LDRB	R3,[R1], #1	// Carregar o byte apontado por R1 em R3, R1 += 1.
	CMP	R3, #0		// Comparar o valor em R3 com 0 (fim da mensagem).
	BEQ	endl		// Se for igual sair do loop.
	ADD	R2, #1		// Senão incrementar o tamanho da mensagem em R2
	B	loop		// e continuar o loop.
endl:	POP	{R1, PC}	// Trazer R1 e PC (Program Counter) da pilha.

_start:
	LDR	R7, =SYS_WRITE	// Número da chamada do sistema em R7 (escrever).
	LDR	R0, =STDOUT	// Valor do destino em R0 (saída padrão, 1).
	LDR	R1, =mensagem	// Endereço da mensagem em R1.
	BL	msgsize		// Armazenar o tamanho da mensagem em R2.
	SVC	0		// Chamar o sistema operacional.
end:
	LDR	R7, =SYS_EXIT	// Número da chamada do sistema em R7 (terminar).
	SVC	0		// Chamar o sistema operacional.

Makefile:

hello_procedure: hello_procedure.o
	ld -o hello_procedure hello_procedure.o
hello_procedure.o: hello_procedure.s
	as -o hello_procedure.o hello_procedure.s
clean:
	rm hello_procedure.o hello_procedure

Construção e execução:

pi@raspberrypi:~/assembly/hello_procedure $ make
as -o hello_procedure.o hello_procedure.s
ld -o hello_procedure hello_procedure.o
pi@raspberrypi:~/assembly/hello_procedure $ ./hello_procedure 
Hello Procedure

↑ Acima