原代码是一句嵌入式汇编:
asm volatile("LDR r0,[%0]" ::"r"(BME_BIT_SET((u32)PORT->PUEL,0)));
反汇编变成:
0x950: 0xbf00 NOP
asm volatile("LDR r0,[%0]" ::"r"(BME_BIT_SET((u32)PORT->PUEL,0)));
0x952: 0x481b LDR.N R0, [PC, #0x6c] ; 0x40049004 (1074040836)
0x954: 0x6800 LDR R0, [R0]
0x956: 0x21c0 MOVS R1, #192 ; 0xc0
0x958: 0x0509 LSLS R1, R1, #20
0x95a: 0x4301 ORRS R1, R1, R0
0x95c: 0x6808 LDR R0, [R1]
0x95e: 0x6800 LDR R0, [R0]
asm("nop");
0x960: 0xbf00 NOP
其实只有第1,2句正确。 后面几句画蛇添足,跟踪最后LDR R0,[R0]就跑飞了。进入异常中断。
请教这IAR 编译器啥毛病?
PORT->PUEL 是CPU某寄存器,目的是利用BME 进行位设置操作。将其0位置一
|