中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-08-01 02:23
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » [求助]如何在C函数和汇编过程之间传递参数? 查看 1,658 回复 5
楼 主 [求助]如何在C函数和汇编过程之间传递参数? 发表于 2009-04-20 04:12 ·  中国 北京 中移铁通
新手上路
积分 4
发帖 1
注册 2009-02-20 15:59
17年会员
UID 139380
性别 男
状态 离线
最近在读一个程序,C调用汇编模块中的过程。我发现汇编过程定义时并没有指明参数,C中对此过程的声明中却有参数,这是怎么回事??

请高手指教!
2 发表于 2009-04-23 05:27 ·  中国 北京 昌平区 联通
高级用户
★★
积分 506
发帖 187
注册 2005-12-04 22:41
20年会员
UID 46500
性别 男
状态 离线
没有代码,谁敢说是怎么回事。
3 发表于 2009-04-26 13:40 ·  中国 福建 厦门 电信
高级用户
★★★
积分 741
发帖 366
注册 2007-07-25 19:11
19年会员
UID 94024
性别 男
状态 离线
C语言的参数传递是通过堆栈来完成,所以汇编语言取参数的时候只需要直接从堆栈获取参数(等等),没必要再声明参数。反过来汇编调用C函数可以直接使用invoke 函数名],酱紫看起来就很直观了。

[ Last edited by netwinxp on 2009-4-26 at 13:45 ]
4 发表于 2009-04-28 07:53 ·  IANA 局域网IP(Private-Use)
初级用户
积分 26
发帖 12
注册 2009-04-25 22:52
17年会员
UID 143791
性别 男
状态 离线
参数不一定是从SP+2处存放,如果是远程过程,是SP+4,Win32环境也是SP+4。
要注意C的传参规范有两种,DOS下默认是[SP+2]对应第一个参数,参数所占堆栈空间由调用者销毁。其实简单传参的话,直接用寄存器伪变量通过寄存器传参也是可以的。
Invoke在Windowsi编程中常用,需要头文件才行,否则要自己申明相应的C函数。
5 发表于 2009-05-02 03:11 ·  中国 福建 厦门 电信
高级用户
★★★
积分 741
发帖 366
注册 2007-07-25 19:11
19年会员
UID 94024
性别 男
状态 离线
补充说明:
1、C参数传递风格是自右往左,简单地说就是[sp+2]是最后一个参数的指针。(pascal与之相反)
2、near调用参数指针为16位,far调用为32位(即4个字节),32位windows全是32位。
6 发表于 2009-05-17 02:41 ·  IANA 局域网IP(Private-Use)
初级用户
积分 26
发帖 12
注册 2009-04-25 22:52
17年会员
UID 143791
性别 男
状态 离线
Originally posted by netwinxp at 2009-5-2 03:11:
补充说明:
1、C参数传递风格是自右往左,简单地说就是是最后一个参数的指针。(pascal与之相反)

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