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

Sparky..

23

我要从记忆中走出来,所以我可能会稍微偏离一两个细节.但是,我希望能够让你朝着正确的方向前进.

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

.globl printSomething

如果您使用的是与GCC不同的汇编程序,则关键字可能会有所不同.

下一个重要问题是"如何通过论证"?这在很大程度上取决于您的处理器和OS.由于您的问题标题表示x86,我将假设您使用的是16位或32位模式和标准x86 ABI(而不是x86-64,Windows和Linux之间也不同).通过将C参数推入堆栈,将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和汇编文件编译为目标文件,链接目标文件然后执行.

我希望这有帮助.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值