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 o syscall write (Capítulo 5), precisa informar à 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á contar novamente e atualizar o número.
A solução: cálculo automático do comprimento usando <strong>$</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,
$se torna 1006 $ - message= 1006 − 1000 = 6 (o comprimento)
Observação: 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 a cada cálculo porque sempre se refere à posição atual logo após cada string.
Desafio
FácilCrie uma string called city com o valor 'Paris' seguida por uma nova linha (0x0a). Em seguida, crie uma constant called cityLen que automaticamente calculates o length using $ - 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-64Pratique por conta própria: Playground de Assembly