最近做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语言写,完全不会碰到这个问题。终归还是基础不牢啊…