Menu
Coddy logo textTech

Системный вызов Exit (60)

Часть раздела Основы путешествия по Assembly на Coddy. Урок 32 из 45.

Самый важный syscall для любой программы — exit. Без него ваша программа продолжала бы выполняться бесконечно или аварийно завершилась бы, когда достигла бы конца памяти.

Номер syscall для выхода — 60.

Синтаксис:

mov rax, 60    ; номер системного вызова для exit
mov rdi, 0     ; код выхода (0 = успех)
syscall        ; попросить ОС завершить работу

Что происходит при выполнении <strong>syscall</strong> с <strong>rax = 60</strong>:

  1. CPU переходит в ядро Linux
  2. Ядро видит: "exit syscall with code 0"
  1. Ядро завершает вашу программу
  2. Ядро возвращает управление оболочке или операционной системе

Код выхода 0 означает success: программа завершилась без ошибок. Коды выхода от 1 до 255 указывают на различные ошибки. Ты можешь выбрать любое number, чтобы сообщить, что пошло не так.

Почему коды выхода важны:

После завершения программы оболочка (терминал) сохраняет код выхода. Вы можете проверить его с помощью:

./myprogram
echo $?    ; Выводит код выхода

Это полезно для:

  • Скриптов, которые проверяют, успешно ли завершилась программа
  • Отладки (разные коды для разных ошибок)
  • Объединения программ в цепочку

Полная минимальная программа:

section .text
    global _start

_start:
    mov rax, 60    ; системный вызов exit
    mov rdi, 0     ; код выхода 0 (успех)
    syscall

Эта программа не делает ничего видимого. Она просто успешно завершается. Но это действительная, полноценная программа.

Давайте упомянем, что такое global _start и _start:.

КодЧто этоЗачем это нужно
global _startСообщает linker, где начинается ваша программаБез этого linker не знает, какая метка является entry point
_start:Метка, обозначающая начало вашего кодаCPU начинает executing здесь

Вам не нужно запоминать подробности. Просто знайте, что в каждом main.asm перед вашим кодом должны быть эти две строки. Вы будете использовать их в каждой программе.

Что произойдёт, если забыть системный вызов exit?

Если не включить системный вызов exit, CPU продолжит выполнять произвольные данные data, которые случайно окажутся в памяти после вашего кода. Обычно это приводит к ошибке сегментации (сбою) или совершенно неожиданному поведению. Ваша программа не завершится корректно.

Всегда завершайте свою программу системным вызовом exit.

challenge icon

Задание

Добавьте системный вызов exit с кодом выхода 5.

Код для вывода сообщения "Exiting with code 5" уже предоставлен. Пока вам не нужно его понимать. Это будет рассмотрено в главе 5.

Ваша задача — только добавить системный вызов exit в конце.

Попробуйте сами

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: Добавьте системный вызов exit с кодом выхода 5
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы

Потренируйтесь самостоятельно: Песочница Assembly