Menu
CoddyTech

Что такое системный вызов?

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

Вы писали ассемблерные инструкции, такие как mov и lea. Эти инструкции выполняются непосредственно на процессоре. Но что, если вам нужно сделать что-то, чего процессор не может сделать самостоятельно, например вывести данные на экран, прочитать данные с клавиатуры или завершить программу?

Для этих заданий тебе нужна операционная система (в этом курсе — Linux).

Что такое системный вызов?

syscall (системный вызов) — это запрос вашей программы к операционной системе. Так вы просите ОС что-то сделать для вас.

Зачем нужны системные вызовы:

ЗадачаМожет ли процессор выполнить её самостоятельно?Нужен системный вызов?
Сложить два числаДаНет
Переместить данные между регистрамиДаНет
Вывести текст на экранНетДа
Считать ввод с клавиатурыНетДа
Завершить программуНетДа
Открыть файлНетДа

Как работает системный вызов:

  1. Вы помещаете номер системного вызова в rax (сообщает ОС, что вы хотите)
  2. Вы помещаете аргументы в другие регистры (rdi, rsi, rdx и т. д.)
  3. Вы выполняете инструкцию syscall
  1. ЦП переходит к ядру ОС
  2. ОС выполняет запрос
  3. ОС возвращает управление вашей программе

Аналогия:

Представь, что системный вызов — это обращение в государственное учреждение:

ШагАналогияВ ассемблере
1Реши, какая услуга тебе нужнаВыбери номер системного вызова (помести в rax)
2Заполни формыПомести аргументы в регистры
3Отправь запросВыполни syscall
4Государственное учреждение обрабатывает егоЯдро ОС выполняет работу
5Получи результатПрограмма продолжает работу

Системные вызовы, которые вы изучите в этом курсе:

Системный вызовНомерЧто делаетГлава
exit60Завершает программуГлава 4
write1Выводит текст на экранГлава 5

Самый важный системный вызов на данный момент: exit

Без exit ваша программа продолжала бы работать бесконечно или завершилась бы с ошибкой. Каждая написанная вами программа должна завершаться системным вызовом exit.

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

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

В этом уроке нет задания по программированию.

quiz iconПроверьте себя

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

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

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