You need to enable JavaScript to run this app. 32位Ubuntu环境下如何将C语言参数传递给汇编函数实现write系统调用
优惠活动
大模型
产品
解决方案
定价
更多

32位Ubuntu环境下如何将C语言参数传递给汇编函数实现write系统调用

实现方案

核心原理

32位x86环境下C语言默认使用cdecl调用约定:

  • 参数从右往左依次压入栈中
  • 进入汇编函数后,%esp指向栈顶存储的返回地址
  • 第一个参数位于%esp + 4位置,第二个参数位于%esp + 8位置,以此类推
  • 被调用的汇编函数需要保留%ebx、%esi、%edi、%ebp寄存器的原始值,返回前要恢复
  • 函数返回值存放在%eax寄存器中

修改后的汇编代码(my_write.s)

.globl my_write
.type my_write, @function

.section .text
my_write:
    push %ebx                # 保存C调用约定要求保留的ebx寄存器

    mov $0x4, %eax           # 指定调用write系统调用(32位Linux系统调用号为4)
    mov $0x1, %ebx           # 指定输出到标准输出(文件描述符为1)
    mov 8(%esp), %ecx        # 读取第一个参数:传入的字符串指针
    mov 12(%esp), %edx       # 读取第二个参数:传入的字符串长度
    int $0x80                # 触发系统调用,写入完成后返回值自动存在eax中

    pop %ebx                 # 恢复ebx寄存器的原始值
    ret                      # 返回到C代码的调用位置,不需要再执行exit系统调用

使用说明

你提供的C调用代码无需额外修改,仍然使用原有命令编译即可:

gcc -Wall main.c my_write.s -o main

运行生成的main程序就可以正常打印你传入的自定义字符串。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 01:15:05