Wywołanie systemowe write (1)
Część sekcji Podstawy ścieżki Assembly w Coddy. Lekcja 35 z 45.
Wiesz już, jak zakończyć działanie programu. Jednak ciche zakończenie nie jest zbyt przydatne. Chcesz, aby program wypisywał dane wyjściowe, żeby użytkownik mógł coś zobaczyć.
Do tego potrzebujesz wywołania systemowego write.
Czym jest wywołanie systemowe write?
Wywołanie systemowe write informuje system operacyjny, że ma wyświetlić tekst na ekranie (lub zapisać go w pliku). Dzięki niemu Twój program generuje dane wyjściowe.
Numer systemowy syscall dla write to 1.
Jak działa write:
W przeciwieństwie do wywołania systemowego exit (które wymaga tylko jednego argumentu), write wymaga trzech argumentów:
| Argument | Rejestr | Co robi | Przykład |
|---|---|---|---|
| Deskryptor pliku | rdi | Gdzie zapisywać (1 = ekran) | mov rdi, 1 |
| Adres bufora | rsi | Gdzie w pamięci znajduje się tekst | mov rsi, message |
| Liczba bajtów | rdx | Ile bajtów wydrukować | mov rdx, 13 |
Wywołanie systemowe write w akcji:
mov rax, 1 ; numer wywołania systemowego dla write
mov rdi, 1 ; deskryptor pliku 1 = stdout (ekran)
mov rsi, msg ; adres ciągu znaków do wypisania
mov rdx, 13 ; liczba bajtów do wypisania
syscall ; zleć systemowi operacyjnemu wypisanieAby wyświetlić komunikat na ekranie, potrzebujemy 5 wierszy. Najpierw wpisujemy numer wywołania systemowego 1 do rax, aby zapisywać. Następnie wpisujemy 1 do rdi, aby powiedzieć systemowi operacyjnemu, że ma wyświetlić tekst na ekranie.
Następnie umieszczamy adres ciągu znaków (msg) w rsi. Potem umieszczamy liczbę bajtów (13) w rdx. Na koniec wykonujemy syscall, aby poprosić system operacyjny o wyświetlenie tekstu.
Co się dzieje, gdy wykonujesz write:
- Procesor przechodzi do jądra Linux
- Jądro widzi: "wywołanie systemowe write"
- Odczytuje
rdi(gdzie zapisać),rsi(gdzie znajduje się tekst) irdx(ile bajtów)
- Wyświetla tekst na ekranie
- Zwraca sterowanie do twojego programu
Łącząc to z ciągiem znaków:
section .data
msg db 'Hello', 0x0a ; ciąg znaków ze znakiem nowej linii
section .text
global _start
_start:
mov rax, 1 ; wywołanie systemowe write
mov rdi, 1 ; stdout
mov rsi, msg ; adres ciągu znaków
mov rdx, 6 ; długość (Hello + znak nowej linii = 6 bajtów)
syscall
mov rax, 60 ; wywołanie systemowe exit
mov rdi, 0
syscallTen program wyświetla Hello, a następnie kończy działanie.
Wyzwanie
Napisz program, który wypisuje komunikat "Hi", a po nim znak nowej linii. Użyj wywołania systemowego write.
Ciąg znaków jest już zdefiniowany w zestawie testowym. Musisz jedynie przygotować argumenty wywołania systemowego.
Spróbuj swoich sił
section .data
msg db 'Hi', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
; TODO: Przygotuj i wywołaj wywołanie systemowe write, aby wypisać msg
; Użyj rax=1, rdi=1, rsi=msg, rdx=msgLen
; Zakończ program
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