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