Menu
Coddy logo textTech

Adres bufora (rsi)

Część sekcji Podstawy ścieżki Assembly w Coddy. Lekcja 37 z 45.

W wywołaniu systemowym write, po wskazaniu systemowi operacyjnemu, gdzie wysłać dane wyjściowe (deskryptor pliku w rdi), musisz powiedzieć mu, co ma wypisać. Robisz to, przekazując adres ciągu znaków w pamięci.

Rejestrem adresu bufora jest rsi.

Czym jest bufor?

Bufor to po prostu blok pamięci, który przechowuje dane. W naszym przypadku bufor to ciąg znaków, który chcemy wyświetlić.

Dlaczego adres, a nie sama wartość?

Wywołanie systemowe write musi wiedzieć, gdzie ciąg znaków zaczyna się w pamięci. Będzie odczytywać bajty od tego adresu, aż osiągnie długość określoną w rdx. Nie wysyłasz rzeczywistych znaków do wywołania systemowego. Wysyłasz ich lokalizację.

Przykład:

section .data
    msg db 'Hello', 0x0a

section .text
    mov rsi, msg        ; rsi przechowuje adres msg

Czym naprawdę jest <strong>msg</strong>:

msg to etykieta. Asembler zastępuje ją liczbą: adresem pamięci, pod którym przechowywany jest ciąg znaków 'Hello'. Gdy piszesz mov rsi, msg, umieszczasz tę liczbę będącą adresem w rsi.

Co się stanie, jeśli zapomnisz adresu?

Jeśli nie ustawisz rsi, rejestr będzie zawierał przypadkową wartość, która znajdowała się tam wcześniej. System operacyjny spróbuje odczytać dane z losowego adresu pamięci, co prawdopodobnie spowoduje błąd ochrony pamięci (awarię).

Kompletny przykład z wywołaniem systemowym write:

section .data
    msg db 'Hello', 0x0a
    len equ $ - msg

section .text
    mov rax, 1          ; wywołanie systemowe write
    mov rdi, 1          ; stdout
    mov rsi, msg        ; adres ciągu znaków
    mov rdx, len        ; liczba bajtów
    syscall
challenge icon

Wyzwanie

Dany jest ciąg znaków o nazwie greeting i wartości 'Hi', po którym następuje znak nowej linii. Napisz wiersz kodu, który ładuje adres greeting do rsi.

Napisz tylko instrukcję mov dla rsi.

Spróbuj swoich sił

section .text
    global _start

_start:
    %include "solution.asm"
    
    mov rax, 1
    mov rdi, 1
    ; rsi ma już adres (z kodu ucznia)
    mov rdx, greetingLen
    syscall

    mov rax, 60
    mov rdi, 0
    syscall
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Podstawy

Poćwicz samodzielnie: Edytor online Assembly