中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-10-31 07:46
共 47,815 主题排行 / 349,930 发帖 / 今日 0 篇 / 48,290 会员排行
DOS开发编程 & 发展交流 (开发室) » [求助]如何在C函数和汇编过程之间传递参数?
可打印版本  1,890 / 5
第1楼 fuwei1979 发表于 2009-04-20 04:12
新手上路 发帖 1 积分 4
[求助]如何在C函数和汇编过程之间传递参数?
最近在读一个程序,C调用汇编模块中的过程。我发现汇编过程定义时并没有指明参数,C中对此过程的声明中却有参数,这是怎么回事??

请高手指教!
第2楼 zhgwbzhd 发表于 2009-04-23 05:27
高级用户 发帖 187 积分 506
没有代码,谁敢说是怎么回事。
第3楼 netwinxp 发表于 2009-04-26 13:40
高级用户 发帖 366 积分 741
C语言的参数传递是通过堆栈来完成,所以汇编语言取参数的时候只需要直接从堆栈获取参数(等等),没必要再声明参数。反过来汇编调用C函数可以直接使用invoke 函数名],酱紫看起来就很直观了。

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

刚好说反了吧。C调用约定的一个优势就是支持不定参数,要是SP+2是最后一个参数,被调用的程序如何知道第一个参数在哪呢?
你说的自右往左其实是压栈顺序,由于堆栈向下生长,对应于SP就刚好反过来——从左向右!
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023