Menu
Coddy logo textTech

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 programu

Co się dzieje po wykonaniu <strong>syscall</strong> z <strong>rax = 60</strong>:

  1. CPU przechodzi do jądra Linux
  2. Jądro widzi: „wywołanie systemowe exit z kodem 0”
  1. Jądro kończy działanie twojego programu
  2. 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 code

Przydaje 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)
    syscall

Ten 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:.

KodCo to jestDlaczego tego potrzebujesz
global _startInformuje konsolidator, gdzie zaczyna się programBez tego konsolidator nie wie, która etykieta jest punktem wejścia
_start:Etykieta oznaczająca początek koduProcesor 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.

challenge icon

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
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