Символ $
Часть раздела Основы путешествия по 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', новая строка)Длина каждой строки вычисляется автоматически. $ сбрасывается при каждом вычислении, поскольку всегда указывает на текущую позицию сразу после каждой строки.
Задание
ЛегкоСоздай строку с именем 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