Board logo

标题: [求助]如何在C函数和汇编过程之间传递参数? [打印本页]

作者: fuwei1979     时间: 2009-4-20 04:12    标题: [求助]如何在C函数和汇编过程之间传递参数?
最近在读一个程序,C调用汇编模块中的过程。我发现汇编过程定义时并没有指明参数,C中对此过程的声明中却有参数,这是怎么回事??

请高手指教!

作者: zhgwbzhd     时间: 2009-4-23 05:27
没有代码,谁敢说是怎么回事。

作者: netwinxp     时间: 2009-4-26 13:40
C语言的参数传递是通过堆栈来完成,所以汇编语言取参数的时候只需要直接从堆栈获取参数(等等),没必要再声明参数。反过来汇编调用C函数可以直接使用invoke 函数名],酱紫看起来就很直观了。

Last edited by netwinxp on 2009-4-26 at 13:45 ]

作者: MarsKeeper     时间: 2009-4-28 07:53
参数不一定是从SP+2处存放,如果是远程过程,是SP+4,Win32环境也是SP+4。
要注意C的传参规范有两种,DOS下默认是[SP+2]对应第一个参数,参数所占堆栈空间由调用者销毁。其实简单传参的话,直接用寄存器伪变量通过寄存器传参也是可以的。
Invoke在Windowsi编程中常用,需要头文件才行,否则要自己申明相应的C函数。

作者: netwinxp     时间: 2009-5-2 03:11
补充说明:
1、C参数传递风格是自右往左,简单地说就是[sp+2]是最后一个参数的指针。(pascal与之相反)
2、near调用参数指针为16位,far调用为32位(即4个字节),32位windows全是32位。

作者: MarsKeeper     时间: 2009-5-17 02:41
Originally posted by netwinxp at 2009-5-2 03:11:
补充说明:
1、C参数传递风格是自右往左,简单地说就是是最后一个参数的指针。(pascal与之相反)

刚好说反了吧。C调用约定的一个优势就是支持不定参数,要是SP+2是最后一个参数,被调用的程序如何知道第一个参数在哪呢?
你说的自右往左其实是压栈顺序,由于堆栈向下生长,对应于SP就刚好反过来——从左向右!