我正在使用gcc
为mips32
进行编译,并且在全局范围内声明了一个指向名为OSEvent
的结构的指针,如下所示:
OSEvent *__osMainEventQueue = NULL;
此外,某个函数中的代码在调用函数时会引用此指针:
__osEnqueueEvent(event, __osMainEventQueue);
该函数声明如下:
extern void __osEnqueueEvent (OSEvent *event, OSEvent *queue);
但是,在调试此代码时,尽管我没有在其中放置任何东西,但gcc
似乎取消了对__osMainEventQueue
的指针引用。您可以在反汇编中看到以下内容:
118: 3c020000 lui v0,0x0
118: R_MIPS_HI16 __osMainEventQueue
11c: 8c420000 lw v0,0(v0)
11c: R_MIPS_LO16 __osMainEventQueue
120: 00402825 move a1,v0
124: 8fc40018 lw a0,24(s8)
128: 0c000000 jal 0 <osScheduleEvent>
128: R_MIPS_26 __osEnqueueEvent
12c: 00000000 nop
gcc是否有任何理由会取消引用该指针?我需要用&
引用它吗? (这会导致类型不匹配警告,因此我不会认为这是令人满意的解释/答案)
答案 0 :(得分:3)
没有指针取消引用。代码只是将__osMainEventQueue
的 value 加载到$a1
(即它指向的地址)中。
请考虑以下情形:__osMainEventQueue
位于地址0x12345678
处,并包含值0xDEADBEEF
。因此,lui
和lw
组合的作用是首先向$v0
加载值0x12340000
。然后它从0x5678($v0)
开始加载,即从(0x12345678)
开始加载,因此您最终在0xDEADBEEF
中进入了$v0
。在此代码中,从不尝试读取(0xDEADBEEF)
。