Menu
CoddyTech

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 program działałby bez końca 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 syscall z rax = 60:

  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 mają znaczenie:

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

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 bez błędów. Ale jest poprawnym, kompletnym programem.

Wspomnijmy o tym, czym są global _start i _start:.

KodCo to jestDlaczego tego potrzebujesz
global _startInformuje linker, gdzie zaczyna się programBez tego linker nie wie, która etykieta jest punktem wejścia
_start:Etykieta oznaczająca początek koduCPU rozpoczyna tutaj wykonywanie

Nie musisz zapamiętywać szczegółów. Wystarczy wiedzieć, że każdy plik main.asm musi zawierać te dwie linie przed kodem. Będziesz ich używać w każdym programie.

Co się stanie, jeśli zapomnisz o wywołaniu systemowym exit?

Jeśli nie uwzględnisz wywołania systemowego exit, 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 całkowicie 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 wypisujący komunikat "Exiting with code 5" jest już dostępny. 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