为什么我的ARM控制器中的链接寄存器指向返回地址+ 1

问题描述 投票:0回答:1

我有一个伪代码:

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微控制器。

arm microcontroller cortex-m
1个回答
0
投票

这是一个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这样的链接器将为您添加一个蹦床。

© www.soinside.com 2019 - 2024. All rights reserved.