有一个语法问题

来源:百度知道 编辑:UC知道 时间:2024/06/25 20:28:24
刚才其实已经问过了,但还是不对。在我编的程序里

*((t_32*)(&gdtr[2]))=(t_32)(gdt);

是对的,而

*((t_32*)(&gdtr[2]))=*((t_32*)(&gdt));

就不对了,老说gdt加载出错,我debug查了一下,第二种情况存的值居然是0!!

为什么啊?我用的是GCC 4,Windows下的DJGPP。
这是哪个函数:
void cstart()
{
.....
memcpy(gdt,*((t_32*)(&gdtr[2])),*((t_16*)(&gdtr[0]))+1);
DispStr(" Done.\n");
DispStr("Reseting GDTR ...");
*((t_16*)(&gdtr[0]))=0x7ff;
*((t_32*)(&gdtr[2]))=(t_32)(gdt);
DispStr(" Done.\n");
.....
}
是这样的,gdt之前就写好了,我只是想把它复制过来,到变量gdt中。这是他们的定义,EXTERN 定义为extern
EXTERN t_8 gdtr[6];
EXTERN t_8 gdt[2048];

wangtk1982 的方法也不行。

gzlu说(t_32)(gdt)是把t_8类型的gdt转换成t_32类型,我觉得不对。我是这样定义的:t_8 gdt[2048];
就是说有2048个t_8类型变量。而gdt本身是个指针,不是t_8类型。好比定义char a[1024];a的类型不是char一样。
另外第二行,我强制转换的是(&gdt),不是gdt,gdt是t_8*变量,而&gdt是t_8**变量啊。

不好意思,刚才没注意到gdt是t_8[]。这样的话,

*((t_32*)(&gdtr[2]))=(t_32)(gdt);

表示把gdt数组的地址转换成t_32。并存放在gdtr的后四个字节中。这样写最关键的一点是在你的机器上gdt数组的地址也是32位表示,可以当作t_32存放起来,即这里实际上在将t_8 *转换成t_32. 成功地把gdt的地址保存在gdtr中,而且gdtr的前两个字节表示它所指向的数据区的长度减1.



*((t_32*)(&gdtr[2]))=*((t_32*)(&gdt));

表示把gdt所指向的数组数据区实际上看作了一个t_32并取出它的值。显然不符合你的需求。

这就是区别了。还有一点提醒你注意就是gdt和&gdt实际上是一样的,都是t_8 *

贴个完整的上来吧~gdt有实体吗?

*((t_32*)(&gdtr[2]))=(void *)(*((t_32*)(&gdt)));
试试看~

(t_32*)(&gdt) == reinterpret_cast<t_32*>(&gdt);

是把gdt的地址强制变成t_32指针 非常不理解gdt本身就是定义实体的指针,那么在gdt的地址是否存在可以强制转换? 不会是个NULL吧~ 所以你调试出来个0

不想再去翻书的化去CSDN问吧~那里达人多~

gdt 本身已经是一个指针了,你再去取他的地址?当然会出错了。

还有你上面的好象也不对呀?
你把一个指针(t_8 *)对象副值给对象(t_8)类型不匹配呀。

*((t_32*)(&gdtr[2]))=(t_32)(gdt);
上式也就是:
gdtr[2]=&gdt[0];

改成: *((t_32*)(&gdtr[2]))=*(&(t_32*)(gdt)); 就对了

什么 GCC 4 什么来的??????
??????????????????
????
?