Strings em Assembly NASM
De forma geral, strings são simplesmente conjuntos de dados, ou seja, sequências de números armazenadas em memória. Neste contexto, as strings serão tratadas como sequências de caracteres. Como cada caractere é, essencialmente, um código numérico, uma string pode ser representada como um conjunto de códigos ASCII:
section .data
chars db 72, 101, 108, 108, 111 ; string "Hello"Cada número corresponde ao código de um caractere na tabela ASCII. Também é possível declarar a string diretamente com os caracteres entre aspas:
section .data
chars db "H", "e", "l", "l", "o"Para simplificar, o NASM permite declarar toda a sequência de uma vez, dentro de aspas duplas:
section .data
chars db "Hello"Combinação de Caracteres e Códigos Numéricos
Quando é necessário inserir caracteres não imprimíveis (como o de nova linha, cujo código é 10), eles podem ser adicionados após a string, separados por vírgulas:
section .data
chars db "Hello", 10É possível misturar caracteres imprimíveis e não imprimíveis:
section .data
chars db "Hello", 10, "Hello World"Acessando Strings na Memória
Ao acessar uma string pelo nome da variável, o processador carrega o primeiro caractere (ou byte) em um registrador. Por exemplo:
global _start
section .data
message db "Hello PROGRAMICIO.COM"
section .text
_start:
movzx rdi, byte [message] ; RDI = 72 (código do caractere "H")
mov rax, 60
syscallNesse caso, apenas o primeiro caractere é movido para o registrador RDI.
Exibindo Strings na Tela (Linux)
Os sistemas operacionais modernos oferecem chamadas de sistema específicas para a exibição de texto. No Linux, essa operação é realizada pela função write, cujo número é 1, e que requer três parâmetros:
RDI→ descritor de saída (por exemplo, 1 para o terminal);RSI→ endereço da string;RDX→ comprimento da string, em bytes.
O exemplo a seguir mostra como exibir uma string na tela:
global _start
section .data
message db "Hello PROGRAMICIO.COM"
count equ $ - message ; comprimento da string em bytes
section .text
_start:
mov rdi, 1 ; descritor de saída padrão (console)
mov rsi, message ; endereço da string
mov rdx, count ; comprimento da string
mov rax, 1 ; número da função write
syscall ; chamada do sistema para exibir a string
mov rax, 60
syscallCompilação e Execução
Abaixo, um exemplo de compilação e execução no Linux (com o nome do usuário programicio):
programicio@machine:~/asm$ nasm -f elf64 hello.asm -o hello.o programicio@machine:~/asm$ ld hello.o -o hello programicio@machine:~/asm$ ./hello Hello PROGRAMICIO.COM programicio@machine:~/asm$
Resumo
- Strings em NASM são sequências de bytes que representam códigos ASCII.
- Cada caractere ocupa 1 byte.
- Podem ser declaradas como listas de números ou entre aspas duplas.
- Caracteres não imprimíveis, como nova linha (10), podem ser adicionados com vírgulas.
- O primeiro byte da string é acessado ao referenciar o nome da variável.
- Para exibir strings no Linux, utiliza-se a chamada de sistema write (1), com
RDI,RSIeRDXcomo parâmetros.