汇编语言调用c函数,从x86汇编语言中调用C函数

这篇博客探讨了在x86环境下,C语言和汇编语言交互时如何进行参数传递。在C中使用`extern`关键字声明未定义的函数,而在汇编中则使用`.globl`指令。x86参数通过堆栈从右到左传递,调用者负责清理。博主详细解释了16位和32位模式下的参数压栈和堆栈指针调整,并提供了示例代码。最后,提到了编译、链接和执行的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我从这里回忆,所以我可能会在一两个细节上稍微偏离。不过,我希望这足以让你朝着正确的方向前进。

您将需要告诉GCC汇编程序,您的例程printSomething()没有在您的程序集文件中定义。在'C'中,您可以使用extern关键字。对于装配,您需要使用.globl。

.globl printSomething

如果使用与GCC不同的汇编器,关键字可能会有所不同。

下一个大问题是'我该如何传递参数'?这非常依赖于你的处理器和操作系统。由于问题的标题指示x86,因此我将假设您正在使用16位或32位模式以及标准x86 ABI(与Windows和Linux之间的x86-64不同)。 C参数通过将它们推入堆栈传递给被调用的例程。他们从右到左推入堆栈。

因此,

printSomething (arg1, arg2, arg3, arg4);

转换为...

pushl arg4

pushl arg3

pushl arg2

pushl arg1

call printSomething

addl $0x10, %esp

您可能会问自己,这是什么

addl $0x10, %esp

?我们将四个32位参数传递(也就是推送)到例程(到堆栈中)。尽管该例程知道期望这些参数,但它不负责将它们从堆栈弹出。来电者对此负责。所以,当我们从例程中返回后,我们调整堆栈指针,放弃先前推入堆栈的四个32位参数。

在上面的例子中,我假设我们在32位模式下运行。如果是16位模式,这将是...

pushw arg4

pushw arg3

pushw arg2

pushw arg1

call printSomething

addw $0x8, %sp

我意识到,在你的榜样,printSomething()只需要一(1)的说法,在我的例子中,我使用了四个(4) 。根据需要调整我的示例。

对于最后的步骤,您需要将C和汇编文件编译为目标文件,链接目标文件然后执行。

我希望这会有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值