Menu
Coddy logo textTech

Символ $

Часть раздела Основы путешествия по Assembly на Coddy. Урок 29 из 45.

Когда вы выводите строку с помощью системного вызова write (глава 5), вам нужно сообщить ЦП, сколько bytes вывести.

Вы могли бы посчитать символы вручную:

message db 'Hello', 0x0a    ; 6 байт (H e l l o новая строка)
mov rdx, 6                  ; Ручной подсчёт

Но Manual подсчёт выполняется медленно и подвержен ошибкам. Если вы измените string, вам придётся пересчитать и обновить число.

Решение: автоматический расчёт длины using <strong>$</strong>

$ — это счётчик размещения. Он представляет текущий адрес памяти, по которому будет размещён следующий байт.

Пример 1: Простая строка

section .data
    message db 'Hello', 0x0a
    msgLen equ $ - message

Как это работает:

  • message — начальный адрес (пример: 1000)
  • После сохранения 6 bytes $ становится равным 1006
  • $ - message = 1006 − 1000 = 6 (длина)

Примечание: equ означает equate. Он создаёт constant: имя, представляющее значение.

Пример 2: Несколько строк

section .data
    first db 'Hi', 0x0a
    len1 equ $ - first      ; len1 = 3 ('H','i', новая строка)
    
    second db 'Hello', 0x0a
    len2 equ $ - second     ; len2 = 6 ('H','e','l','l','o', новая строка)

Для каждой строки её длина рассчитывается автоматически. $ сбрасывается при каждом вычислении, поскольку всегда ссылается на текущую позицию сразу после каждой строки.

challenge icon

Задание

Легко

Создайте строку с именем city со значением 'Paris', за которой следует перевод строки (0x0a). Затем создайте константу с именем cityLen, которая автоматически вычисляет длину, используя $ - city.

Попробуйте сами

%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 iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы

Потренируйтесь самостоятельно: Песочница Assembly