Menu
Coddy logo textTech

Количество байт (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
challenge icon

Задание

Вам дана строка с именем 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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы