El símbolo $
Parte de la sección Fundamentos del Journey de Assembly de Coddy. Lección 29 de 45.
Cuando imprimes una cadena usando la llamada al sistema write (capítulo 5), debes indicarle a la CPU cuántos bytes imprimir.
Podrías contar los caracteres manualmente:
message db 'Hello', 0x0a ; 6 bytes (H e l l o nueva línea)
mov rdx, 6 ; Conteo manualPero contar manualmente es lento y propenso a errores. Si cambias la cadena, debes volver a contar y actualizar el número.
La solución: cálculo automático de la longitud mediante $
$ es el contador de ubicación. Representa la dirección de memoria actual donde se colocará el siguiente byte.
Ejemplo 1: Cadena simple
section .data
message db 'Hello', 0x0a
msgLen equ $ - messageCómo funciona:
messagees la dirección inicial (ejemplo: 1000)- Después de almacenar 6 bytes,
$se convierte en 1006 $ - message= 1006 − 1000 = 6 (la longitud)
Nota: equ significa igualar. Crea una constante: un nombre que representa un valor.
Ejemplo 2: varias cadenas
section .data
first db 'Hi', 0x0a
len1 equ $ - first ; len1 = 3 ('H','i', nueva línea)
second db 'Hello', 0x0a
len2 equ $ - second ; len2 = 6 ('H','e','l','l','o', nueva línea)Cada cadena tiene su propia longitud, calculada automáticamente. $ se restablece para cada cálculo porque siempre hace referencia a la posición actual justo después de cada cadena.
Desafío
FácilCrea una cadena llamada city con el valor 'Paris' seguida de un salto de línea (0x0a). Después, crea una constante llamada cityLen que calcule automáticamente la longitud usando $ - city.
Pruébalo tú mismo
%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 lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Fundamentos
1La máquina
¿Qué es la CPU?MemoriaRegistros vs. MemoriaCómo funcionan las instruccionesPatrón de dos archivosLa arquitectura x86-64Practica por tu cuenta: Playground de Assembly