Адрес буфера (rsi)
Часть раздела Основы путешествия по Assembly на Coddy — урок 37 из 45.
В системном вызове write, после того как вы укажете ОС, куда отправить вывод (файловый дескриптор в rdi), вам нужно указать ей, что именно печатать. Вы делаете это, передавая адрес строки в памяти.
Регистром для адреса буфера является rsi.
Что такое буфер?
Буфер — это просто блок памяти, в котором хранятся данные. В нашем случае буфер — это строка, которую мы хотим напечатать.
Почему адрес, а не само значение?
Системному вызову write необходимо знать, где в памяти начинается строка. Он будет считывать байты по этому адресу до тех пор, пока не достигнет длины, указанной вами в rdx. Вы не отправляете сами символы системному вызову — вы отправляете их местоположение.
Пример:
section .data
msg db 'Hello', 0x0a
section .text
mov rsi, msg ; rsi содержит адрес msgЧем <strong>msg</strong> является на самом деле:
msg — это метка. Ассемблер заменяет её числом — адресом памяти, по которому хранится строка 'Hello'. Когда вы пишете mov rsi, msg, вы помещаете этот адрес в rsi.
Что произойдет, если вы забудете адрес?
Если вы не установите rsi, регистр будет содержать любой «мусор», который был там раньше. ОС попытается прочитать данные из случайного адреса памяти, что, скорее всего, приведет к ошибке сегментации (segmentation fault / сбою).
Полный пример с системным вызовом 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