Системный вызов Exit (60)
Часть раздела Основы путешествия по Assembly на Coddy — урок 32 из 45.
Самым важным системным вызовом для любой программы является exit. Без него ваша программа продолжала бы работать вечно или аварийно завершилась бы при достижении конца памяти.
Номер системного вызова exit — 60.
Синтаксис:
mov rax, 60 ; номер системного вызова для exit
mov rdi, 0 ; код выхода (0 = успех)
syscall ; запрос к ОС на выходЧто происходит при выполнении <strong>syscall</strong> с <strong>rax = 60</strong>:
- Процессор переходит в ядро Linux
- Ядро видит: «системный вызов exit с кодом 0»
- Ядро завершает вашу программу
- Ядро возвращает управление оболочке или операционной системе
Код завершения 0 означает успех — программа завершилась без ошибок. Коды завершения от 1 до 255 указывают на различные ошибки. Вы можете выбрать любое число, чтобы просигнализировать о том, что пошло не так.
Почему важны коды завершения:
После завершения работы вашей программы оболочка (терминал) сохраняет код завершения. Вы можете проверить его с помощью:
./myprogram
echo $? ; Выводит код завершенияЭто полезно для:
- Скриптов, которые проверяют, успешно ли завершилась программа
- Отладки (разные коды для разных ошибок)
- Объединения программ в цепочки
Полная минимальная программа:
section .text
global _start
_start:
mov rax, 60 ; системный вызов exit
mov rdi, 0 ; код выхода 0 (успех)
syscallЭта программа не делает ничего видимого — она просто успешно завершается. Но это правильная, полная программа.
Давайте упомянем, что такое global _start и _start:.
| Код | Что это такое | Зачем это нужно |
|---|---|---|
global _start | Сообщает компоновщику, где начинается ваша программа | Без этого компоновщик не будет знать, какая метка является точкой входа |
_start: | Метка, обозначающая начало вашего кода | Процессор начинает выполнение отсюда |
Вам не нужно запоминать детали. Просто знайте, что в каждом main.asm перед вашим кодом должны быть эти две строки. Вы будете использовать их в каждой программе.
Что произойдет, если вы забудете системный вызов exit?
Если вы не включите системный вызов exit, процессор продолжит выполнять любые мусорные данные, которые окажутся в памяти после вашего кода. Это обычно приводит к ошибке сегментации (segmentation fault, сбой) или совершенно непредсказуемому поведению. Ваша программа не завершится корректно.
Всегда завершайте свою программу системным вызовом 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)Коды завершенияИтоги: корректное завершение