R a s p b e r e d

Usando o Raspberry Pi

Bonito nome o seu (svc + macro)

Programa para ler o nome e mostrar “Bonito nome o seu {nome lido}”

Usa chamadas ao sistema operacional (SVC) para ler o nome na entrada padrão e mostrar o texto na saída padrão através de uma macro

/**
 * @file    bonito_nome_seu_macro.s
 * @author  Halley Pacheco de Oliveira
 * @version 1.0
 * 
 * @section DESCRIPTION
 *
 * Programa para ler o nome e mostrar "Bonito nome o seu {nome lido}"
 * 
 * Usa chamadas ao sistema operacional (SVC) para ler o nome na entrada
 * padrão e mostrar o texto na saída padrão através de uma macro.
 *
 * @output "Bonito nome o seu {nome lido}"
 * @return Número de bytes lidos
 */

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

// Equivalências

.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.

// Macro

.macro syscall servico, descritor, texto, numbytes
        MOV     R7, #\servico   // Número da chamada do sistema em R7.
        MOV     R0, #\descritor // Descritor do arquivo em R0.
        LDR     R1, =\texto     // Endereço do texto em R1.
        .if     \numbytes > 0   // Se o número de bytes foi informado
        MOV     R2, #\numbytes  // Então R2 = Número de bytes informado
        .else                   // Senão
        LDR     R2, [SP]        // R2 = Número de bytes lidos na pilha.
        .endif
        SVC     0               // Chamar o sistema operacional.
.endm

// Dados

.data

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

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

.align
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, 0

end:
        MOV     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:~/raspbered/assembly/bonito_nome_seu $ make clean
rm bonito_nome_seu.o bonito_nome_seu

pi@raspberrypi:~/raspbered/assembly/bonito_nome_seu $ make
as -o bonito_nome_seu.o bonito_nome_seu.s
ld -o bonito_nome_seu bonito_nome_seu.o

pi@raspberrypi:~/raspbered/assembly/bonito_nome_seu $ ./bonito_nome_seu ; echo $?
Oi, digite seu nome: Zé Osório Gonçalves
Bonito nome o seu Zé Osório Gonçalves
23
Última atualização em 2019-07-27
Publicado em 2019-07-27