Menu
Coddy logo textTech

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 manual

Mas 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 $ - message

Como 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.

challenge icon

Desafio

Fácil

Crie 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
    syscall
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Fundamentos