GCC在存在';不可能

GCC在存在';不可能,gcc,mips,gnu,Gcc,Mips,Gnu,我正在使用gcc为mips32编译,我声明了一个指向全局范围内名为OSEvent的结构的指针,如下所示: OSEvent *__osMainEventQueue = NULL; extern void __osEnqueueEvent (OSEvent *event, OSEvent *queue); 此外,在调用函数期间,特定函数中的代码引用此指针: __osEnqueueEvent(event, __osMainEventQueue); 该函数声明如下: OSEvent *__osMa

我正在使用
gcc
mips32
编译,我声明了一个指向全局范围内名为
OSEvent
的结构的指针,如下所示:

OSEvent *__osMainEventQueue = NULL;
extern void __osEnqueueEvent (OSEvent *event, OSEvent *queue);
此外,在调用函数期间,特定函数中的代码引用此指针:

__osEnqueueEvent(event, __osMainEventQueue);
该函数声明如下:

OSEvent *__osMainEventQueue = NULL;
extern void __osEnqueueEvent (OSEvent *event, OSEvent *queue);
然而,在调试这段代码时,
gcc
似乎取消了对
\uuu 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
118:3c020000 lui v0,0x0
118:R_MIPS_HI16__osMainEventQueue
11c:8c420000 lw v0,0(v0)
11c:R\u MIPS\u LO16\u osMainEventQueue
120:00402825移动a1,v0
124:8fc40018 lw a0,24(s8)
128:0亿日航0
128:R_MIPS_26___oseQueueEvent
12c:00000000无

gcc是否有任何理由取消引用此指针?我需要用
引用它吗?(这会导致类型不匹配警告,所以我不认为这是一个满意的解释/答案)

< P>没有指针引用。代码只是将
\uu osMainEventQueue
的值加载到
$a1
中(即它指向的地址)


考虑以下场景:
\uuu osMainEventQueue
位于地址
0x12345678
并包含值
0xDEADBEEF
。因此,
lui
lw
组合所做的是首先加载值为
0x12340000
$v0
。然后它从
0x5678($v0)
加载,即从
(0x12345678)
加载,因此在
$v0
中以
0xDEADBEEF
结束。此代码中从未尝试读取
(0xDEADBEEF)

没有指针取消引用。代码只是将
\uu osMainEventQueue
的值加载到
$a1
中(即它指向的地址)


考虑以下场景:
\uuu osMainEventQueue
位于地址
0x12345678
并包含值
0xDEADBEEF
。因此,
lui
lw
组合所做的是首先加载值为
0x12340000
$v0
。然后它从
0x5678($v0)
加载,即从
(0x12345678)
加载,因此在
$v0
中以
0xDEADBEEF
结束。此代码中从未尝试读取
(0xDEADBEEF)

谢谢!我应该意识到_osMainEventQueue重定位指向_osMainEventQueue的地址,而不是值。我想要+1,但是我没有足够的时间。谢谢!我应该意识到_osMainEventQueue重定位指向_osMainEventQueue的地址,而不是值。我想要+1,但我没有足够的代表