pbn/curso/exemplos/08/salve-read.asm
2025-06-02 11:48:21 -03:00

83 lines
2.2 KiB
NASM

; ----------------------------------------------------------
; Chamadas de sistema
; ----------------------------------------------------------
%define SYS_READ 0
%define SYS_WRITE 1
%define SYS_EXIT 60
; ----------------------------------------------------------
; Descritores de arquivos padrão
; ----------------------------------------------------------
%define STDIN_FD 0
%define STDOUT_FD 1
; ----------------------------------------------------------
; Estados de término
; ----------------------------------------------------------
%define EXIT_SUCCESS 0
; ----------------------------------------------------------
; Constantes simbólicas
; ----------------------------------------------------------
%define BUF_SIZE 256
; ----------------------------------------------------------
section .rodata
; ----------------------------------------------------------
msg db `Salve, simpatia!\nQual é a sua graça?\n`
msg_len equ $ - msg
resp db "Falaê, "
resp_len equ $ - resp
tail db `!\n`
; ----------------------------------------------------------
section .bss
; ----------------------------------------------------------
buf resb BUF_SIZE ; Buffer de leitura
count resd 1 ; retorno de read (int)
; ----------------------------------------------------------
section .text
; ----------------------------------------------------------
global _start
_start:
; Imprime a mensagem inicial
mov rsi, msg
mov rdx, msg_len
call _print
; Aguarda os dados da entrada padrão
mov rax, SYS_READ
mov rdi, STDIN_FD
mov rsi, buf
mov rdx, BUF_SIZE
syscall
; Salva retorno da chamada (bytes lidos)
mov [count], eax
; Imprime prefixo da resposta
mov rsi, resp
mov rdx, resp_len
call _print
; Imprime resposta
mov rsi, buf
mov rdx, [count] ; total de bytes lidos
dec rdx ; desconta \n
call _print
; Imprime final da resposta
mov rsi, tail
mov rdx, 2 ; !\n = 2 bytes
call _print
; Termina o programa
mov rax, SYS_EXIT
mov rdi, EXIT_SUCCESS
syscall
; ----------------------------------------------------------
; Sub-rotinas...
; ----------------------------------------------------------
_print:
; ----------------------------------------------------------
mov rax, SYS_WRITE
mov rdi, STDOUT_FD
syscall
ret