为何/dev/stdout对应"1"?mov EBX,"1"代表/dev/stdout的依据文档在哪?
嘿,这个问题问到点子上了,我来一步步给你拆解清楚:
在类Unix系统(包括Linux)里,每个进程打开的文件都会被分配一个文件描述符(File Descriptor,简称FD)——这是个非负整数,系统靠它来识别不同的文件。早在上世纪70年代的初代Unix中,就约定了三个默认自动打开的FD:
- 0:对应标准输入(stdin)
- 1:对应标准输出(stdout)
- 2:对应标准错误(stderr)
后来这个约定被POSIX标准正式标准化,成为所有类Unix系统必须遵守的规则。而/dev/stdout是一个特殊的符号链接,它指向当前进程stdout对应的实际文件(比如终端设备、你重定向的日志文件等),它对应的FD编号正是1——所以"1"和/dev/stdout的关联,本质就是这个标准FD编号的映射。
mov EBX,"1"表示指向/dev/stdout的依据是什么? 首先得纠正一个小细节:通常汇编里指向stdout的正确写法是mov EBX, 1(注意是数值1,不是字符串"1")。如果看到mov EBX,"1",这其实是把字符'1'的ASCII值(0x31)加载到EBX寄存器里,这可不是正确的FD编号——大概率是代码写错了,或者是某些特殊场景下的笔误。
回到核心依据:在Linux系统调用中,比如sys_write(用于向文件写入内容的系统调用),它的第一个参数就是文件描述符。根据前面提到的POSIX标准约定,FD 1对应stdout,所以当你把EBX寄存器设为数值1,再调用sys_write时,系统就知道你要往标准输出写入内容。这完全基于POSIX和Linux内核对标准文件描述符的定义,/dev/stdout和FD 1本质指向同一个标准输出流——FD 1是内核层面的标识,/dev/stdout是用户态的符号链接,二者是等价的。
你可以从这些官方渠道找到权威定义:
- Linux手册页(man pages):
- 执行
man 2 write,里面会明确说明sys_write的第一个参数是文件描述符,且1对应stdout; - 执行
man 3 stdin,会详细讲解三个标准流对应的FD编号; - 执行
man filesystem,里面有关于/dev/std*这类特殊设备文件的说明。
- 执行
- POSIX标准文档:POSIX.1-2017(IEEE Std 1003.1-2017)中的"Standard I/O Streams"章节,明确规定了0、1、2分别对应stdin、stdout、stderr。这是类Unix系统的核心规范,所有合规系统都遵循此约定。
内容的提问来源于stack exchange,提问作者Y. HSUN LU

