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