O Símbolo $
Parte da seção Fundamentos do Journey de Assembly da Coddy — lição 29 de 45.
Quando você imprime uma string usando a syscall write (Capítulo 5), você precisa dizer à CPU quantos bytes imprimir.
Você poderia contar os caracteres manualmente:
message db 'Hello', 0x0a ; 6 bytes (H e l l o nova linha)
mov rdx, 6 ; Contagem manualMas a contagem manual é lenta e propensa a erros. Se você alterar a string, deverá recontar e atualizar o número.
A solução: cálculo automático de comprimento usando <strong>$lt;/strong>
$ é o contador de localização — ele representa o endereço de memória atual onde o próximo byte será colocado.
Exemplo 1: String simples
section .data
message db 'Hello', 0x0a
msgLen equ $ - messageComo funciona:
messageé o endereço inicial (exemplo: 1000)- Após armazenar 6 bytes,
$torna-se 1006 $ - message= 1006 − 1000 = 6 (o comprimento)
Nota: equ significa equate. Ele cria uma constante — um nome que representa um valor.
Exemplo 2: Múltiplas strings
section .data
first db 'Hi', 0x0a
len1 equ $ - first ; len1 = 3 ('H','i', nova linha)
second db 'Hello', 0x0a
len2 equ $ - second ; len2 = 6 ('H','e','l','l','o', nova linha)
Cada string tem seu próprio comprimento calculado automaticamente. O $ é redefinido para cada cálculo porque ele sempre se refere à posição atual logo após cada string.
Desafio
FácilCrie uma string chamada city com o valor 'Paris' seguido por uma nova linha (0x0a). Em seguida, crie uma constante chamada cityLen que calcula automaticamente o comprimento usando $ - city.
Experimente você mesmo
%include "data.asm"
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, city
mov rdx, cityLen
syscall
mov rax, 60
mov rdi, 0
syscallEsta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Fundamentos
1A Máquina
O que é CPUMemóriaRegistradores vs MemóriaComo as instruções funcionamPadrão de Dois ArquivosA Arquitetura x86-64