QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 965|回复: 5

一个C语言指针的编译问题,高手进!

[复制链接]
发表于 2005-8-31 10:56:50 | 显示全部楼层 |阅读模式
进来小兄弟在读uC/OS-II的源码,但碰到了一个让我很迷惑的问题:
程序是在windows的DOS控制台里用BCC编译的,基本上可以认为是
纯DOS模式了,我想问问,在DOS的实模式下用大模式编译时如果有一个这样的函数:
void f(int * pi){
}

请问当有下面的调用时:
void g(){
  int *pi=2;
  f(pi);
}
它会被编译成什么样的,请用汇编加以说明。
其实我不理解的地方主要还是编译会把段寄器和偏移都压栈吗?
C语言内部编译的时候对指针类型到底是怎么处理的?
有高手给大概说下原理吧。我自己的猜想是它可能是直接把这个指针变量做为它所指对像的一个别名,比如例子中就把pi做为i 的一个别名,而参数传递时只要把
i 的段基寄存器和偏移值传过去就行了,我只是这么猜的,不知道实际上一般是怎么做的,而且现在网上讨论80X86实模式的文章很少啊。
还是其它的处理方式,望不吝赐教!
 楼主| 发表于 2005-9-1 20:33:30 | 显示全部楼层
贴了好几天了,小弟心里急,望大牛给于解答,或指正
回复

使用道具 举报

发表于 2005-9-2 09:12:58 | 显示全部楼层
你的程序里:
int *pi=2;
f(pi);
建议改为:
int pi=2;
f(&pi);
回复

使用道具 举报

 楼主| 发表于 2005-9-2 12:59:47 | 显示全部楼层
[quote:f0d25a27e9="cddxhy"]你的程序里:
int *pi=2;
f(pi);
建议改为:
int pi=2;
f(&pi);[/quote]

这不是问题的关键吧,再说了改成那样也不影响什么啊,这里只是为了说明pi是个指针类型。
回复

使用道具 举报

发表于 2005-9-2 16:00:04 | 显示全部楼层
哥们你还是用 -S 开关来看看编译出来的代码好了。
现在弟兄们手头可能都没有bcc,更没有dos,怎么能给你解答呢。。。 :neutral:
回复

使用道具 举报

 楼主| 发表于 2005-9-2 17:31:47 | 显示全部楼层
OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);

被编译成
push        0
        push        ds
        push        offset DGROUP:_TaskStartStk+1022
        push        0
        push        0
        push        seg _TaskStart
        push        offset _TaskStart
        call        far ptr _OSTaskCreate
呵呵,学了一手,谢谢了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-3 04:24 , Processed in 0.055129 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表