Menu
Coddy logo textTech

Символ $

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

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

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

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

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

Решение: автоматический расчет длины с использованием <strong>$lt;/strong>

$ — это счетчик адреса (location counter) — он представляет собой текущий адрес памяти, по которому будет помещен следующий байт.

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

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

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