Wywołanie systemowe zakończenia (60)
Część sekcji Podstawy ścieżki Assembly w Coddy. Lekcja 32 z 45.
Najważniejszym wywołaniem systemowym dla każdego programu jest exit. Bez niego Twój program działałby w nieskończoność albo uległ awarii po dotarciu do końca pamięci.
Numer wywołania systemowego exit to 60.
Składnia:
mov rax, 60 ; numer wywołania systemowego dla exit
mov rdi, 0 ; kod zakończenia (0 = sukces)
syscall ; poproś system operacyjny o zakończenie programuCo się dzieje po wykonaniu <strong>syscall</strong> z <strong>rax = 60</strong>:
- CPU przechodzi do jądra Linux
- Jądro widzi: „wywołanie systemowe exit z kodem 0”
- Jądro kończy działanie twojego programu
- Jądro przekazuje sterowanie z powrotem do powłoki lub systemu operacyjnego
Kod wyjścia 0 oznacza sukces: program zakończył działanie bez błędów. Kody wyjścia od 1 do 255 wskazują różne błędy. Możesz wybrać dowolną liczbę, aby zasygnalizować, co poszło nie tak.
Dlaczego kody wyjścia są ważne:
Po zakończeniu działania programu powłoka (terminal) przechowuje kod wyjścia. Możesz go sprawdzić za pomocą:
./myprogram
echo $? ; Prints the exit codePrzydaje się to do:
- Skryptów sprawdzających, czy program zakończył się powodzeniem
- Debugowania (różne kody dla różnych błędów)
- Łączenia programów ze sobą
Kompletny minimalny program:
section .text
global _start
_start:
mov rax, 60 ; wywołanie systemowe zakończenia programu
mov rdi, 0 ; kod zakończenia 0 (sukces)
syscallTen program nie robi nic widocznego. Po prostu kończy działanie pomyślnie. Jest jednak poprawnym, kompletnym programem.
Wspomnijmy o tym, czym są global _start i _start:.
| Kod | Co to jest | Dlaczego tego potrzebujesz |
|---|---|---|
global _start | Informuje konsolidator, gdzie zaczyna się program | Bez tego konsolidator nie wie, która etykieta jest punktem wejścia |
_start: | Etykieta oznaczająca początek kodu | Procesor zaczyna tutaj wykonywanie kodu |
Nie musisz zapamiętywać szczegółów. Wystarczy, że wiesz, że każdy plik main.asm musi mieć te dwa wiersze przed kodem. Będziesz ich używać w każdym programie.
Co się stanie, jeśli zapomnisz o wywołaniu systemowym zakończenia programu?
Jeśli nie uwzględnisz wywołania systemowego zakończenia programu, CPU będzie nadal wykonywać przypadkowe dane, które akurat znajdują się w pamięci za twoim kodem. Zwykle powoduje to błąd ochrony pamięci (awarię) lub zupełnie nieoczekiwane zachowanie. Twój program nie zakończy się prawidłowo.
Zawsze kończ program wywołaniem systemowym exit.
Wyzwanie
Dodaj wywołanie systemowe zakończenia programu z kodem wyjścia 5.
Kod do wypisania komunikatu "Exiting with code 5" jest już podany. Nie musisz go jeszcze rozumieć. Zostanie omówiony w rozdziale 5.
Twoim zadaniem jest tylko dodanie na końcu wywołania systemowego zakończenia programu.
Spróbuj swoich sił
section .data
msg db 'Exiting with code 5', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msgLen
syscall
; TODO: Dodaj wywołanie systemowe exit z kodem wyjścia 5
Ta 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ńczeniePoćwicz samodzielnie: Edytor online Assembly