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 msgCzym 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
syscallWyzwanie
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
syscallTa lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Podstawy
1Maszyna
Czym jest CPUPamięćRejestry a pamięćJak działają instrukcjeWzorzec dwóch plikówArchitektura x86-642Systemy liczbowe
Dlaczego system binarny?Liczby binarneZamiana z systemu dziesiętnego na binarnyDlaczego system szesnastkowy?Zamiana z systemu szesnastkowego na dziesiętnyZamiana z systemu dziesiętnego na szesnastkowyASCII i system szesnastkowy5Wywołanie systemowe zakończenia
Czym jest syscall?Wywołanie systemowe zakończenia (60)Kody zakończeniaPodsumowanie: prawidłowe zakończenie3Pierwsza instrukcja – MOV
Czym jest MOV?MOV z wartością natychmiastowąMOV między rejestramiMOV z pamięci do rejestruMOV z rejestru do pamięciLEA – załaduj adresMOV z różnymi rozmiaramiĆwiczenie: zamiana rejestrówPowtórka: wyzwanie MOV6Wywołanie systemowe write
Wywołanie systemowe write (1)Deskryptor pliku (rdi)Adres bufora (rsi)Liczba bajtów (rdx)Połączmy elementyWyświetlanie dwóch ciągówZnak nowej linii ma znaczeniePodsumowanie: konfiguracja writePoćwicz samodzielnie: Edytor online Assembly