Символ $
Часть раздела Основы путешествия по 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', новая строка)
Для каждой строки её длина рассчитывается автоматически. $ сбрасывается при каждом вычислении, поскольку всегда ссылается на текущую позицию сразу после каждой строки.
Задание
ЛегкоСоздайте строку с именем 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В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Машина
Что такое CPUПамятьРегистры против памятиКак работают инструкцииПаттерн двух файловАрхитектура x86-64Потренируйтесь самостоятельно: Песочница Assembly