Количество байт (rdx)
Часть раздела Основы путешествия по Assembly на Coddy — урок 38 из 45.
Вы сообщили ОС, куда печатать (rdi) и что печатать (rsi). Теперь вам нужно сообщить ей, сколько байт нужно напечатать.
Регистр для количества байт — rdx.
Зачем ОС нужна длина?
ОС не знает, где заканчивается ваша строка. Без указания длины она продолжала бы читать память бесконечно. Длина точно сообщает ОС, когда нужно остановиться.
Пример:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rdx, msgLen ; rdx = количество байтов для выводаЧто произойдет, если длина указана неверно?
| Если вы установите | Результат |
|---|---|
| Слишком короткая | Будет напечатана только часть строки |
| Слишком длинная | ОС продолжит чтение за пределами вашей строки в «мусорную» память — могут быть напечатаны случайные символы или произойти сбой |
| Ноль | Ничего не печатается |
Автоматическое вычисление длины:
Вы уже изучили шаблон $ - label в главе 3:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg ; msgLen = 6 (Hello + символ новой строки)Это гарантирует, что длина всегда будет правильной, даже если вы измените строку.
Полный пример:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rax, 1 ; системный вызов write
mov rdi, 1 ; стандартный вывод (stdout)
mov rsi, msg ; адрес строки
mov rdx, msgLen ; количество байт
syscallЗадание
Вам дана строка с именем color со значением 'Red', за которым следует символ новой строки. Константа с именем colorLen уже определена с помощью $ - color.
Напишите строку кода, которая устанавливает rdx равным длине строки, используя константу colorLen.
Напишите только инструкцию mov для rdx.
Попробуйте сами
section .text
global _start
_start:
; Код студента выполняется первым (устанавливает rdx)
%include "solution.asm"
mov rax, 1
mov rdi, 1
mov rsi, color
; rdx уже содержит длину (из кода студента)
syscall
mov rax, 60
mov rdi, 0
syscallВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Машина
Что такое CPUПамятьРегистры против памятиКак работают инструкцииПаттерн двух файловАрхитектура x86-643Первая инструкция — MOV
Что такое MOV?MOV: непосредственные значенияMOV: из регистра в регистрMOV: из памяти в регистрMOV: из регистра в памятьLEA — загрузка адресаMOV с операндами разных размеровПрактика: обмен значениями регистровИтоги: испытание MOV6Системный вызов write
Системный вызов write (1)Дескриптор файла (rdi)Адрес буфера (rsi)Количество байт (rdx)Собираем всё вместеПечать двух строкВажность новой строкиИтоги: Настройка write