Menu
Coddy logo textTech

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