Menu
Coddy logo textTech

Символ $

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

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

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

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

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

Решение: автоматический расчёт длины с использованием $

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

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

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

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

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

Примечание: equ означает equate. Он создаёт константу: имя, обозначающее значение.

Пример 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