R a s p b e r e d

Usando o Raspberry Pi

Bonito nome o seu (svc)

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.

/**
 * @file    bonito_nome_seu.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.
 *
 * @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
.equ    SYS_READ, 3
.equ    SYS_WRITE, 4
.equ    STDIN, 0
.equ    STDOUT, 1

// 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:

        MOV     R7, #SYS_WRITE  // Número da chamada do sistema em R7 (escrever).
        MOV     R0, #STDOUT     // Descritor do arquivo em R0 (saída padrão, 1)
        LDR     R1, =pedido     // Endereço da mensagem de pedido em R1.
        MOV     R2, #TAM_PEDIDO // Número de bytes a serem escritos.
        SVC     0               // Chamar o sistema operacional.

        MOV     R7, #SYS_READ   // Número da chamada do sistema em R7 (ler).
        MOV     R0, #STDIN      // Descritor do arquivo em R0 (entrada padrão, 0)
        LDR     R1, =nome       // Endereço para guardar o nome lido em R1.
        MOV     R2, #TAM_MAX    // Tamanho máximo do nome a ser lido.
        SVC     0               // Chamar o sistema operacional.
        
        PUSH    {R0}            // Guardar o número de bytes lidos na pilha.

        MOV     R7, #SYS_WRITE  // Número da chamada do sistema em R7 (escrever).
        MOV     R0, #STDOUT     // Descritor do arquivo em R0 (saída padrão, 1)
        LDR     R1, =elogio     // Endereço da mensagem de elogio em R1.
        MOV     R2, #TAM_ELOG   // Tamanho da mensagem de elogio em R2.
        SVC     0               // Chamar o sistema operacional.

        MOV     R7, #SYS_WRITE  // Número da chamada do sistema em R7 (escrever).
        MOV     R0, #STDOUT     // Descritor do arquivo em R0 (saída padrão, 1)
        LDR     R1, =nome       // Endereço do nome lido em R1.
        LDR     R2, [SP]        // Número de bytes lidos (ler na pilha).
        SVC     0               // Chamar o sistema operacional.
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: bonito_nome_seu.o
        ld -o bonito_nome_seu bonito_nome_seu.o
bonito_nome_seu.o: bonito_nome_seu.s
        as -o bonito_nome_seu.o bonito_nome_seu.s
clean:
        rm bonito_nome_seu.o bonito_nome_seu

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