Дескриптор файла (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) | Системный вызов write ожидает ввод, а не вывод — завершится ошибкой или ничего не сделает |
| 2 (stderr) | Работает как stdout (выводит на экран), но предназначен для ошибок |
| Любое другое число | Ядро не распознает его — системный вызов завершается ошибкой |
Задание
Вам дана строка с именем message со значением 'OK', за которым следует символ новой строки. Напишите строку кода, которая устанавливает файловый дескриптор для вывода на экран (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