R a s p b e r e d

Usando o Raspberry Pi

Hello Procedure

Programa para escrever “Hello Procedure” na saída padrão

Tamanho da mensagem calculado numa procedure

/**
 * @file    hello_procedure.s
 * @author  Halley Pacheco de Oliveira
 * @version 1.0
 * 
 * @section DESCRIPTION
 *
 * Programa para escrever "Hello Procedure" na saída padrão.
 *
 * Tamanho da mensagem calculado numa procedure.
 *
 * @output "Hello Procedure"
 * @return Tamanho da mensagem
 */

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

// Equivalências

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

// Dados

.data

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

// Código

.text
.global _start

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

_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, =mensagem   // Endereço da mensagem em R1.
        BL      msgsize         // Armazenar o tamanho da mensagem em R9.
        MOV     R2, R9          // Tamanho da mensagem em R2.
        SVC     0               // Chamar o sistema operacional.
end:
        MOV     R7, #SYS_EXIT   // Número da chamada do sistema em R7 (terminar).
        MOV     R0, R9          // Retornar o tamanho da mensagem.
        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:~/raspbered/assembly/hello_procedure $ make clean
rm hello_procedure.o hello_procedure

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

pi@raspberrypi:~/raspbered/assembly/hello_procedure $ ./hello_procedure ; echo $?
Hello Procedure
16
Última atualização em 2019-07-26
Publicado em 2019-07-26