Hello Counter


/*
 * Programa para escrever "Hello Counter".
 * Tamanho da mensagem calculado no corpo do programa.
 */

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

.data
.align 4

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

.text
.global _start

_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.
	
	MOV	R2, #0		// Inicializar tamanho da mensagem em R2 (zero).
	PUSH	{R1}		// Salvar R1 na pilha
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.
	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}		// Restaurar R1

	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_counter: hello_counter.o
	ld -o hello_counter hello_counter.o
hello_counter.o: hello_counter.s
	as -o hello_counter.o hello_counter.s
clean:
	rm hello_counter.o hello_counter

Construção e execução:

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

↑ Acima