一个问题是未定义指令何时发生....我们是否需要从R14_SVC或R14_UNDEF获取当前执行指令? 。目前我正在研究发生未定义指令的一个问题。在检查R14_SVC时,我发现指令如下:
0x46BFD73C cmp r0, #0x0
0x46BFD740 beq 0x46BFD75C
0x46BFD744 ldr r0,0x46BFE358
所以在我的假设中,在执行指令beq 0x46BFD75C
让我感到困惑的一件事是我检查了r14_undef
并且结构不同。
0x46bfd4b8 bx r14
0x46bfd4bC mov r0, 0x01
0x46bfd4c0 bx r14
哪一个引起了未定义的指令异常?
答案 0 :(得分:3)
您的所有答案都在ARM ARM,ARM架构参考手册中。转到infocenter.arm.com参考手册下找到你感兴趣的架构系列。非cortex-m系列都以同样的方式处理这些异常
When an Undefined Instruction exception occurs, the following actions are performed:
R14_und = address of next instruction after the Undefined instruction
SPSR_und = CPSR
CPSR[4:0] = 0b11011 /* Enter Undefined Instruction mode */
CPSR[5] = 0 /* Execute in ARM state */
/* CPSR[6] is unchanged */
CPSR[7] = 1 /* Disable normal interrupts */
/* CPSR[8] is unchanged */
CPSR[9] = CP15_reg1_EEbit
/* Endianness on exception entry */
if high vectors configured then
PC = 0xFFFF0004
else
PC = 0x00000004
R14_und指向未定义指令后的下一条指令。您必须检查SPSR_und以确定处理器所处的模式(手臂或拇指),以确定是否需要从R14_und中减去2或4以及是否需要获取2或4个字节。不幸的是,如果在支持thumb2的较新架构上,即使在拇指模式下也可能需要获取4个字节,并试图弄清楚发生了什么。作为可变字长,很可能处于无法确定发生了什么的情况。如果您没有使用thumb2指令,那么它是确定性的。