Адрес буфера (rsi)
Часть раздела Основы путешествия по Assembly на Coddy. Урок 37 из 45.
В системном вызове write после указания ОС, куда отправить вывод (дескриптор файла в rdi), нужно указать, что вывести. Для этого передайте адрес строки в памяти.
Регистр для адреса буфера — rsi.
Что такое буфер?
Буфер — это просто блок памяти, в котором хранятся данные. В нашем случае буфер — это строка, которую мы хотим вывести.
Почему адрес, а не само значение?
Системному вызову write нужно знать, где строка начинается в памяти. Он будет считывать байты по этому адресу, пока не достигнет длины, указанной в rdx. Вы не передаёте системному вызову сами символы. Вы передаёте их расположение.
Пример:
section .data
msg db 'Hello', 0x0a
section .text
mov rsi, msg ; rsi содержит адрес msgЧто на самом деле представляет собой msg:
msg — это метка. Ассемблер заменяет её числом: адресом памяти, где хранится строка 'Hello'. Когда ты пишешь mov rsi, msg, ты помещаешь это число-адрес в rsi.
Что произойдёт, если забыть указать адрес?
Если не задать rsi, в регистре останется какое-то случайное значение, которое было там раньше. ОС попытается прочитать данные по случайному адресу памяти, что, скорее всего, приведёт к ошибке сегментации (аварийному завершению программы).
Полный пример с системным вызовом write:
section .data
msg db 'Hello', 0x0a
len equ $ - msg
section .text
mov rax, 1 ; системный вызов write
mov rdi, 1 ; stdout
mov rsi, msg ; адрес строки
mov rdx, len ; количество байтов
syscallЗадание
Дана строка с именем greeting и значением 'Hi', за которым следует символ новой строки. Напиши строку кода, которая загружает адрес greeting в rsi.
Напиши только инструкцию mov для rsi.
Попробуйте сами
section .text
global _start
_start:
%include "solution.asm"
mov rax, 1
mov rdi, 1
; В rsi уже находится адрес (из кода студента)
mov rdx, greetingLen
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