Дескриптор файла (rdi)
Часть раздела Основы путешествия по Assembly на Coddy. Урок 36 из 45.
В предыдущем уроке ты использовал mov rdi, 1 в рамках системного вызова write. Это число 1 называется дескриптором файла.
Дескриптор файла — это число, которое сообщает операционной системе, куда отправить данные.
Три стандартных файловых дескриптора в Linux:
| Файловый дескриптор | Имя | Куда направляются данные |
|---|---|---|
| 0 | stdin | Ввод с клавиатуры (чтение данных от пользователя) |
| 1 | stdout | Вывод на экран (обычный вывод программы) |
| 2 | stderr | Вывод на экран (сообщения об ошибках) |
Зачем нужны два вывода на экран?
Обычный вывод (stdout) и вывод ошибок (stderr) направляются на один и тот же экран, но обрабатываются отдельно. Это позволяет вам:
- Перенаправлять обычный вывод в файл, продолжая видеть ошибки на экране
- Показывать ошибки, даже когда обычный вывод скрыт
Для вывода в этом курсе:
Ты всегда будешь использовать файловый дескриптор 1 (stdout) для вывода сообщений. Пока тебе не нужен stderr.
Пример:
mov rdi, 1 ; отправить вывод в stdout (на экран)Что произойдёт, если использовать неправильный файловый дескриптор?
| Если вы используете | Результат |
|---|---|
| 0 (stdin) | Системный вызов записи ожидает ввод, а не вывод: завершится ошибкой или ничего не сделает |
| 2 (stderr) | Работает как stdout (выводит на экран), но предназначен для ошибок |
| Любое другое число | Ядро его не распознаёт: системный вызов завершается ошибкой |
Задание
Вам дана строка с именем message и значением 'OK', за которым следует новая строка. Напишите строку кода, которая sets дескриптор файла для вывода на screen (stdout). Напишите только инструкцию mov для rdi.
Попробуйте сами
section .data
message db 'OK', 0x0a
msgLen equ $ - message
section .text
global _start
_start:
; Студент устанавливает файловый дескриптор здесь
%include "solution.asm"
mov rax, 1
; rdi уже должен быть установлен студентом
mov rsi, message
mov rdx, msgLen
syscall
mov rax, 60
mov rdi, 0
syscallВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Машина
Что такое CPUПамятьРегистры против памятиКак работают инструкцииПаттерн двух файловАрхитектура x86-643Первая инструкция — MOV
Что такое MOV?MOV: непосредственные значенияMOV: из регистра в регистрMOV: из памяти в регистрMOV: из регистра в памятьLEA — загрузка адресаMOV с операндами разных размеровПрактика: обмен значениями регистровИтоги: испытание MOV6Системный вызов write
Системный вызов write (1)Дескриптор файла (rdi)Адрес буфера (rsi)Количество байт (rdx)Собираем всё вместеПечать двух строкВажность новой строкиИтоги: Настройка writeПотренируйтесь самостоятельно: Песочница Assembly