我正在使用 Cortex M0+;
我试图在常规代码流中保留一段代码,不要问我为什么:)
基本上稍后,我想跳转到MYCODE。
这是代码
bool x = false; // defined somewhere globally
if (x) goto MYCODE; // prevents removal of MYCODE
//goto MYJUMP; // this is working as expected
__asm volatile("BX %0" : : "r" (&&MYJUMP) : ); // this crashes !!!
MYCODE:
__asm volatile ("nop");
__asm volatile ("nop");
__asm volatile ("nop");
MYJUMP:
__asm volatile ("nop"); // first NOP will crash !!!
__asm volatile ("nop");
__asm volatile ("nop");
现在首先,GCC 从 MYCODE 中删除任何东西,无论我使用 -Ox。
说服保留代码的一种方法是将“x”声明为全局并在之前制作一个假的 if()。
另一种方法是使用 jump in assembly with this
__asm volatile("BX %0" : : "r" (&&MYJUMP) : );
生成的代码为
96 __asm volatile("BX %0" : : "r" (&&MYJUMP) : );
0800285e: ldr r3, [pc, #96]
08002860: bx r3 // value is 0800286c
使用内联跳转,老是撞到DefaultHandler! 这很好奇,NOP 看起来很好
08002864: nop ; (mov r8, r8)
100 __asm volatile ("nop");
08002866: nop ; (mov r8, r8)
101 __asm volatile ("nop");
08002868: nop ; (mov r8, r8)
102 __asm volatile ("nop");
0800286a: nop ; (mov r8, r8)
105 __asm volatile ("nop");
0800286c: nop ; (mov r8, r8) // <-- the code reaches here just fine as expected
106 __asm volatile ("nop"); // but when executed this NOP will jump to DefaultHandler
0800286e: nop ; (mov r8, r8)
107 __asm volatile ("nop");
08002870: nop ; (mov r8, r8)
知道发生了什么事吗?
我调试了几个小时,我就是不明白。
我想用汇编跳转,这样GCC就不会优化了
非常感谢!