Menu
CoddyTech

文件描述符(rdi)

本课属于 Coddy Assembly 学习旅程的“基础知识”单元。第 36 课,共 45 课。

在上一课中,你在 write 系统调用中使用了 mov rdi, 1。这个数字 1 称为文件描述符。

文件描述符是一个数字,它告诉操作系统应该将数据发送到哪里。

Linux 中的三个标准文件描述符:

文件描述符名称数据去向
0stdin键盘输入(从用户读取数据)
1stdout屏幕输出(程序的正常输出)
2stderr屏幕输出(错误消息)

为什么屏幕有两个输出流?

普通输出(stdout)和错误输出(stderr)会显示在同一个屏幕上,但它们是分开处理的。这样你就可以:

  • 将普通输出重定向到文件,同时仍能在屏幕上看到错误
  • 即使隐藏了普通输出,也能显示错误

本课程中打印内容时:

打印消息时,你始终会使用文件描述符 1(标准输出)。目前你还不需要使用标准错误。

示例:

mov rdi, 1      ; 将输出发送到 stdout(屏幕)

如果使用了错误的文件描述符,会发生什么?

如果使用结果
0 (stdin)如果输入来自管道或文件,系统调用会失败。在终端中,文本通常仍会打印出来,但 stdin 用于输入,而不是输出
2 (stderr)和 stdout 一样能正常工作(打印到屏幕上),但它用于错误信息
任何其他数字内核无法识别它:系统调用会失败
challenge icon

挑战

给你一个名为 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
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: Assembly 在线编辑器