Количество байт (rdx)
Часть раздела Основы путешествия по Assembly на Coddy. Урок 38 из 45.
Ты уже сообщил ОС, где печатать (rdi) и что печатать (rsi). Теперь нужно сообщить ей, сколько bytes напечатать.
Регистр для количества bytes — 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Задание
Вам дана string с именем color и значением 'Red', за которым следует новая строка. Константа с именем colorLen уже определена с использованием $ - color.
Напишите строку кода, которая устанавливает для rdx длину string, используя константу 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Потренируйтесь самостоятельно: Песочница Assembly