文件描述符(rdi)
本课属于 Coddy Assembly 学习旅程的“基础知识”单元。第 36 课,共 45 课。
在上一课中,你在 write 系统调用中使用了 mov rdi, 1。这个数字 1 称为文件描述符。
文件描述符是一个数字,它告诉操作系统应该将数据发送到哪里。
Linux 中的三个标准文件描述符:
| 文件描述符 | 名称 | 数据去向 |
|---|---|---|
| 0 | stdin | 键盘输入(从用户读取数据) |
| 1 | stdout | 屏幕输出(程序的正常输出) |
| 2 | stderr | 屏幕输出(错误消息) |
为什么屏幕有两个输出流?
普通输出(stdout)和错误输出(stderr)会显示在同一个屏幕上,但它们是分开处理的。这样你就可以:
- 将普通输出重定向到文件,同时仍能在屏幕上看到错误
- 即使隐藏了普通输出,也能显示错误
本课程中打印内容时:
打印消息时,你始终会使用文件描述符 1(标准输出)。目前你还不需要使用标准错误。
示例:
mov rdi, 1 ; 将输出发送到 stdout(屏幕)如果使用了错误的文件描述符,会发生什么?
| 如果使用 | 结果 |
|---|---|
| 0 (stdin) | 如果输入来自管道或文件,系统调用会失败。在终端中,文本通常仍会打印出来,但 stdin 用于输入,而不是输出 |
| 2 (stderr) | 和 stdout 一样能正常工作(打印到屏幕上),但它用于错误信息 |
| 任何其他数字 | 内核无法识别它:系统调用会失败 |
挑战
给你一个名为 message 的字符串,其值为 'OK',后面跟着一个换行符。写出将文件描述符设置为屏幕输出(stdout)的代码行。只写用于 rdi 的 mov 指令。
亲手试试
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这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Assembly 在线编辑器