Menu
Coddy logo textTech

Системный вызов write (1)

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

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

Для этого вам понадобится системный вызов write.

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

Системный вызов write сообщает операционной системе о необходимости вывести текст на экран (или записать в файл). Это то, как ваша программа создает вывод.

Номер системного вызова для write — 1.

Как работает write:

В отличие от системного вызова exit (которому требуется только один аргумент), write требует три аргумента:

АргументРегистрЧто он делаетПример
Файловый дескрипторrdiКуда писать (1 = экран)mov rdi, 1
Адрес буфераrsiГде текст находится в памятиmov rsi, message
Количество байтrdxСколько байт напечататьmov rdx, 13

Системный вызов write в действии:

mov rax, 1      ; номер системного вызова для write
mov rdi, 1      ; файловый дескриптор 1 = stdout (экран)
mov rsi, msg    ; адрес строки для вывода
mov rdx, 13     ; количество байт для вывода
syscall         ; запрос к ОС на вывод

Чтобы вывести сообщение на экран, нам понадобится 5 строк. Сначала мы помещаем номер системного вызова 1 в rax для записи. Затем мы помещаем 1 в rdi, чтобы указать ОС вывести данные на экран.

Затем мы помещаем адрес строки (msg) в rsi. После этого мы помещаем количество байт (13) в rdx. Наконец, мы выполняем syscall, чтобы попросить ОС выполнить вывод.

Что происходит при выполнении write:

  1. Процессор переходит в ядро Linux
  2. Ядро видит: "write syscall"
  3. Оно считывает rdi (куда писать), rsi (где находится текст) и rdx (сколько байт)
  1. Она выводит текст на экран
  2. Она возвращает управление вашей программе

Собираем всё вместе со строкой:

section .data
    msg db 'Hello', 0x0a    ; строка с символом новой строки

section .text
    global _start

_start:
    mov rax, 1              ; системный вызов write
    mov rdi, 1              ; stdout
    mov rsi, msg            ; адрес строки
    mov rdx, 6              ; длина (Hello + новая строка = 6 байт)
    syscall

    mov rax, 60             ; системный вызов exit
    mov rdi, 0
    syscall

Эта программа выводит Hello и затем завершает работу.

challenge icon

Задание

Напишите программу, которая выводит сообщение "Hi" с последующим символом новой строки. Используйте системный вызов write.

Строка уже определена для вас в тестовой среде. Вам нужно только написать настройку системного вызова.

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

section .data
    msg db 'Hi', 0x0a
    msgLen equ $ - msg

section .text
    global _start

_start:
    ; TODO: Настроить и вызвать системный вызов write для вывода msg
    ; Используйте rax=1, rdi=1, rsi=msg, rdx=msgLen

    ; Выход из программы
    mov rax, 60
    mov rdi, 0
    syscall
quiz iconПроверьте себя

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

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

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