Bonito nome o seu (svc + macro)

/*
 * Programa para ler o nome e mostrar "Bonito nome o seu ..."
 * na console usando chamadas ao sistema operacional através
 * de uma macro. Retorna o número de bytes lidos.
 */

// Raspberry Pi 3 Modelo A+
.cpu	cortex-a53
.fpu	neon-fp-armv8
.syntax	unified 		// Sintaxe moderna

// Equates

.equ	SYS_EXIT, 1		// Chamar o sistema operacional para terminar.
.equ	SYS_READ, 3		// Chamar o sistema operacional para ler.
.equ	SYS_WRITE, 4		// Chamar o sistema operacional para escrever.
.equ	STDIN, 0		// Entrada padrão.
.equ	STDOUT, 1		// Saída padrão.
.equ	IND_PILHA, -1		// Número de bytes lidos armazenado na pilha.

// Macros

.macro syscall servico, fluxo, texto, numbytes
	LDR	R7, =\servico	// Número da chamada do sistema em R7.
	LDR	R0, =\fluxo	// Identificador do fluxo em R0.
	LDR	R1, =\texto	// Endereço do texto em R1.
	LDR	R2, =\numbytes	// Número de bytes lidos ou escritos em R2.
	CMP	R2, #IND_PILHA	// Verificar se o número de bytes está na pilha.
	BNE	svc\@		// Se não estiver ir para svc\@
	LDR	R2, [SP]	// Senão ler o número de bytes na pilha.
svc\@:	SVC	0		// Chamar o sistema operacional.
.endm

// Dados

.data

.align 4
pedido:
	.string	"Oi, digite seu nome: "
.equ	TAM_PEDIDO, (. - pedido)	// Tamanho da mensagem do pedido.

.align 4
elogio:
	.string	"Bonito nome o seu "
.equ	TAM_ELOG, (. - elogio)		// Tamanho da mensagem de elogio.

.align 4
nome:
	.space	256
.equ	TAM_MAX, (. - nome)		// Tamanho máximo do nome lido.

// Código

.text
.global _start

_start:

	// Mostrar a mensagem pedindo para digitar o nome
	syscall	SYS_WRITE, STDOUT, pedido, TAM_PEDIDO

	// Ler o nome na entrada padrão
	syscall	SYS_READ, STDIN, nome, TAM_MAX
	
	PUSH	{R0}		// Guardar o número de bytes lidos na pilha.

	// Mostrar a mensagem elogiando o nome
	syscall	SYS_WRITE, STDOUT, elogio, TAM_ELOG

	// Mostrar o nome digitado (tamanho na pilha)
	syscall	SYS_WRITE, STDOUT, nome, IND_PILHA

end:
	LDR	R7, =SYS_EXIT	// Número da chamada do sistema em R7 (terminar).
	POP	{R0}		// Número de bytes lidos (trazer da pilha).
	SVC	0		// Chamar o sistema operacional.

Makefile:

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

Construção e execução:

pi@raspberrypi:~/assembly/bonito_nome_seu_macro $ make clean
rm bonito_nome_seu_macro.o bonito_nome_seu_macro
pi@raspberrypi:~/assembly/bonito_nome_seu_macro $ make
as -o bonito_nome_seu_macro.o bonito_nome_seu_macro.s
ld -o bonito_nome_seu_macro bonito_nome_seu_macro.o
pi@raspberrypi:~/assembly/bonito_nome_seu_macro $ ./bonito_nome_seu_macro  ; echo $?
Oi, digite seu nome: Zé Osório Gonçalves
Bonito nome o seu Zé Osório Gonçalves
23

↑ Acima