Menu
CoddyTech

Adres bufora (rsi)

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

W wywołaniu systemowym write, po wskazaniu systemowi operacyjnemu, dokąd wysłać dane wyjściowe (deskryptor pliku w rdi), musisz wskazać 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 przechowujący dane. W naszym przypadku buforem jest ciąg znaków, który chcemy wyświetlić.

Dlaczego adres, a nie sama wartość?

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

Przykład:

section .data
    msg db 'Hello', 0x0a

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

Czym naprawdę jest msg:

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

Co się dzieje, gdy zapomnisz adresu?

Jeśli nie ustawisz rsi, rejestr zawiera przypadkową wartość, która znajdowała się w nim wcześniej. System operacyjny próbuje odczytać ciąg znaków z tego adresu. Jeśli adres jest nieprawidłowy, wywołanie systemowe zapisu niczego nie wyświetla, umieszcza kod błędu w rax, a program przechodzi do następnej instrukcji. Jeśli pozostała wartość okaże się adresem pamięci, z której można odczytywać, wywołanie systemowe wyświetli dowolne bajty zapisane pod tym adresem.

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 łańcucha znaków
    mov rdx, len        ; liczba bajtów
    syscall
challenge icon

Wyzwanie

Otrzymujesz ciąg znaków o nazwie greeting o 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 zawiera 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