You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确认x86汇编中$1对应stdout?系统调用寄存器参数文档在哪

关于x86汇编Linux系统调用的两个问题解答

1. 如何确认$1参数对应stdout?

$1对应的是Linux系统中的标准输出文件描述符(STDOUT_FILENO),这是Linux的通用约定:

  • 系统启动后会默认打开三个标准文件描述符:
    • 0 = stdin(标准输入)
    • 1 = stdout(标准输出)
    • 2 = stderr(标准错误)
  • 这个约定是所有Linux程序都遵循的规则,不管是高层语言(比如C)还是直接写汇编调用系统调用,都用这些数值指代对应的标准流。你也可以查看系统头文件unistd.h,里面定义的STDOUT_FILENO宏值就是1,和汇编里的$1完全对应。

2. 在哪里查询特定系统调用中各寄存器的作用说明?

你示例里用的是32位Linux的int 0x80系统调用接口,这类接口的参数传递规则是固定的:

  • %eax 存储系统调用编号(比如write是4,exit是1)
  • 第1到第6个参数依次存在 %ebx、%ecx、%edx、%esi、%edi、%ebp 中

查询这些信息的权威途径:

  • 系统手册页:在终端中执行man 2 write,可以直接看到write系统调用的参数定义,对应到汇编里就是:%ebx是文件描述符、%ecx是输出缓冲区地址、%edx是要写入的字节数;执行man 2 syscalls能查看所有32位系统调用的编号、参数对应寄存器的完整列表。
  • Linux内核源码:内核源码中的arch/x86/entry/syscalls/syscall_32.tbl文件列出了所有32位系统调用的编号和关联函数,函数的参数顺序就是汇编寄存器的传递顺序。
  • 靠谱的汇编教程(比如你参考的WikiBooks章节)也会整理常用系统调用的寄存器对应关系,但手册页是最直接的本地权威参考。

你参考的示例代码

.data
msg: .ascii "Hello World\n"

.text
.global _start
_start:
    movl $4, %eax   # 使用`write`系统调用(int 0x80风格)
    movl $1, %ebx   # 写入到stdout
    movl $msg, %ecx # 要输出的字符串"Hello World"
    movl $12, %edx  # 写入12个字符("Hello World\n"共12字节)
    int $0x80       # 触发系统调用
    
    movl $1, %eax   # 使用`_exit`系统调用(int 0x80风格)
    movl $0, %ebx   # 错误码设为0(正常退出)
    int $0x80       # 触发系统调用

内容的提问来源于stack exchange,提问作者Parker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 12:15:33