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