Menu
CoddyTech

Адрес буфера (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
challenge icon

Задание

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

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

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

Потренируйтесь самостоятельно: Песочница Assembly