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
相关产品推荐
相关产品推荐

