中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » [求助]如何在C函数和汇编过程之间传递参数?
作者:
标题: [求助]如何在C函数和汇编过程之间传递参数? 上一主题 | 下一主题
fuwei1979
新手上路





积分 4
发帖 1
注册 2009-2-20
状态 离线
『楼 主』:  [求助]如何在C函数和汇编过程之间传递参数?

最近在读一个程序,C调用汇编模块中的过程。我发现汇编过程定义时并没有指明参数,C中对此过程的声明中却有参数,这是怎么回事??

请高手指教!

2009-4-20 04:12
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zhgwbzhd
高级用户





积分 506
发帖 187
注册 2005-12-4
状态 离线
『第 2 楼』:  

没有代码,谁敢说是怎么回事。

2009-4-23 05:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
netwinxp
高级用户





积分 741
发帖 366
注册 2007-7-25
状态 离线
『第 3 楼』:  

C语言的参数传递是通过堆栈来完成,所以汇编语言取参数的时候只需要直接从堆栈获取参数([sp+2]等等),没必要再声明参数。反过来汇编调用C函数可以直接使用invoke 函数名[,参数1[,参数...]],酱紫看起来就很直观了。

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

2009-4-26 13:40
查看资料  发短消息 网志   编辑帖子  回复  引用回复
MarsKeeper
初级用户





积分 26
发帖 12
注册 2009-4-25
状态 离线
『第 4 楼』:  

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

2009-4-28 07:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
netwinxp
高级用户





积分 741
发帖 366
注册 2007-7-25
状态 离线
『第 5 楼』:  

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

2009-5-2 03:11
查看资料  发短消息 网志   编辑帖子  回复  引用回复
MarsKeeper
初级用户





积分 26
发帖 12
注册 2009-4-25
状态 离线
『第 6 楼』:  



  Quote:
Originally posted by netwinxp at 2009-5-2 03:11:
补充说明:
1、C参数传递风格是自右往左,简单地说就是[sp+2]是最后一个参数的指针。(pascal与之相反)

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

2009-5-17 02:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: