我有一个伪代码:
int main()
{
while(1)
{
LED_Initialize();
LED_On(0);
delay();
LED_Off(0);
}
return 0;
}
伪代码的汇编看起来像:
0x08000416 F7FFFFB3 BL.W LED_On (0x08000380)
22: delay();
0x0800041A F7FFFFF3 BL.W delay (0x08000404)
23: LED_Off(0);
**0x0800041E** 2000 MOVS r0,#0x00
下一条指令的地址为0x0800041E,但是链接寄存器R14在这种情况下始终为地址+ 1,即0x0800041F。我知道它必须与Thumb指令一起执行某些操作,但是有人可以解释它的整个概念和原因吗?我正在使用STM32F446REXX微控制器。
这是一个cortex-m4,因此您获得了cortex-m4的文档,并说它基于armv7-m架构,因此您获得了cortex-m4的架构参考手册和
以下说明导致将EPSR.T设置为加载到PC的值:— BLX或BX。— PC的LDR。—包含PC的POP或LDM。
因此,请阅读以下内容:
EPSR.T位支持ARM体系结构互通模型,但是,由于ARMv7-M仅支持执行Thumb指令,因此它必须始终保持值1。更新到PC遵守Thumb指令的互通规则必须更新相应地,EPSR.T。 EPSR.T设置为0时的指令执行无效的状态UsageFault,INVSTATE。
公平地说,现在更容易回到原来的手臂,现在称为armv5体系结构参考手册,在该手册中,您已经/拥有完整的尺寸和拇指,并且以一种更好的方式说明,当这些指令消耗该值时,它们采用lsbit并据此做出模式决定,根据位[0]更改/停留在手臂上的更改/停留在拇指上。 PC不会保留该位,它会被指令占用并发送到PSR的T位。
皮质机器是唯一的拇指机器,必须保持该模式,如果您尝试切换为布防状态,则将出现故障。 (同样,如果您的向量表未使用lsbit设置正确构建,则您将无法启动)。
并且请认为这是地址,或者用一个而不是地址加一个地址,因为如果工具运行正确,那么如果添加一个地址,您将得到一个无效的地址并崩溃/故障,如果感觉到该错误,您不会伤害任何东西(除非该地址没有以这种方式使用,那就是另一个错误)。
armv7-ar文档还将涵盖bit [0]主题,以及哪些指令可以切换模式,从开始的armv4t到armv7-ar,还有更多的指令可以切换模式。如果正确构建代码,像gnu ld这样的链接器将为您添加一个蹦床。