R a s p b e r e d

Usando o Raspberry Pi

Hello Counter

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

Tamanho da mensagem calculado no corpo do programa

/**
 * @file    hello_counter.s
 * @author  Halley Pacheco de Oliveira
 * @version 1.0
 * 
 * @section DESCRIPTION
 *
 * Programa para escrever "Hello Counter" na saída padrão.
 *
 * Tamanho da mensagem calculado no corpo do programa.
 *
 * @output "Hello Counter"
 * @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 Counter\n"       // Mensagem a ser exibida

// Código

.text
.global _start

_start:
                                // Calcular o comprimento da mensagem.
        LDR     R1, =mensagem   // Endereço da mensagem em R1.
        MOV     R9, #0          // Inicializar tamanho da mensagem em R9 (zero).
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     endlen          // Se for igual sair do loop.
        ADD     R9, #1          // Senão incrementar o tamanho da mensagem em R9.
        B       loop            // Próximo caractere
endlen:
                                // Mostrar a mensagem
        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.
        MOV     R2, R9          // Tamanho da mensagem em R2
        SVC     0               // Chamar o sistema operacional.

end:

        LDR     R7, =SYS_EXIT   // Número da chamada do sistema em R7 (terminar).
        MOV     R0, R9          // Código de retorno igual ao tamanho da mensagem.
        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:~/raspbered/assembly/hello_counter $ make clean
rm hello_counter.o hello_counter

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

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