GCC 在不应该的地方添加取消引用

GCC adding dereference where there shouldn't be

我正在使用 gccmips32 编译,我在全局范围内声明了一个指向名为 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 取消引用该指针有什么原因吗?我需要用 & 引用它吗? (这会导致类型不匹配警告,所以我认为这不是一个令人满意的解释/答案)

没有指针解除引用。代码只是将 __osMainEventQueuevalue 加载到 $a1(即它指向的地址)。

考虑以下情形:__osMainEventQueue 位于地址 0x12345678 并包含值 0xDEADBEEF。所以 luilw 组合所做的是首先用值 0x12340000 加载 $v0。然后它从 0x5678($v0) 加载,即从 (0x12345678) 加载,所以你最终在 $v0 中得到 0xDEADBEEF。在此代码中从来没有尝试读取 (0xDEADBEEF)