Menu
Coddy logo textTech

Адрес буфера (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
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Проверьте себя

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

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