Системный вызов 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>:
- CPU переходит в ядро Linux
- Ядро видит: "exit syscall with code 0"
- Ядро завершает вашу программу
- Ядро возвращает управление оболочке или операционной системе
Код выхода 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.
Задание
Добавьте системный вызов 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
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Машина
Что такое CPUПамятьРегистры против памятиКак работают инструкцииПаттерн двух файловАрхитектура x86-642Системы счисления
Почему двоичная система?Двоичные числаИз десятичной в двоичнуюПочему шестнадцатеричная система?Из шестнадцатеричной в десятичнуюИз десятичной в шестнадцатеричнуюASCII и Hex5Системный вызов Exit
Что такое системный вызов?Системный вызов Exit (60)Коды завершенияИтоги: корректное завершениеПотренируйтесь самостоятельно: Песочница Assembly