关于函数的calling convention(调用规范)

最近做C和汇编的混合编译时,掉进的一个坑,记一笔。


对于混合编程,最需要注意的地方是平台层面的ABI (application binary interface) 和语言层面的calling convention。

这次的坑:

caller是C语言函数,callee用汇编写的。C函数里的实参用的int型,汇编函数输入需要long型。

在64位平台的汇编,要求INTEGER类型的参数都为64位。我本以为,正确声明了fuction的原型,C编译器会在调用汇编函数之前,将int 型实参转换为long 类型。实际的情况是,在被调函数的堆栈上保留的实参的空间大小,的确是8字节,但是高位根本没有清零,即我预想的隐式类型转换根本没有做。


如果扎实的学习了规范,应该可以知道,高位清零的类型转换应该是由被调用函数完成,C编译器编译caller 的时候,不做这个处理。当然如果callee也用C语言写,完全不会碰到这个问题。终归还是基础不牢啊…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值