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,但我没有足够的代表