Assembly CORTEX M4:BX和BLX指令与LR位(0)混淆

Assembly CORTEX M4:BX和BLX指令与LR位(0)混淆,assembly,arm,cortex-m,Assembly,Arm,Cortex M,我的理解是,对于cortex M4,BX和BLX的地址寄存器必须将位(0)设置为1。我对BLX指令的工作原理感到困惑,执行BLX指令后插入LR寄存器的地址是否将位(0)设置为1?在使用BX指令执行返回之前,是否需要手动将其更改为1 另一个选项是使用:MOV PC,LR,但这似乎违背了分支指令的目的 执行BLX指令后插入LR寄存器的地址是否将位(0)设置为1 对 如果CPU在跳转前以ARM模式运行,BLX指令将LR的位(0)设置为0;如果CPU在Thumb模式运行,则BLX指令将LR的位(0)设置

我的理解是,对于cortex M4,BX和BLX的地址寄存器必须将位(0)设置为1。我对BLX指令的工作原理感到困惑,执行BLX指令后插入LR寄存器的地址是否将位(0)设置为1?在使用BX指令执行返回之前,是否需要手动将其更改为1

另一个选项是使用:MOV PC,LR,但这似乎违背了分支指令的目的

执行BLX指令后插入LR寄存器的地址是否将位(0)设置为1

如果CPU在跳转前以ARM模式运行,BLX指令将LR的位(0)设置为0;如果CPU在Thumb模式运行,则BLX指令将LR的位(0)设置为1

由于Cortex M4仅支持拇指指令模式(而非ARM模式),因此BLX将始终将位(0)设置为1

另一个选项是使用:MOV PC,LR,但这似乎违背了分支指令的目的

在没有拇指模式的旧ARM CPU上,
MOV-PC,LR
指令是“正式”返回指令

缺点是不能从手臂功能返回拇指功能,反之亦然

在只支持拇指模式的CPU上,您也可以使用该指令

执行BLX指令后插入LR寄存器的地址是否将位(0)设置为1

如果CPU在跳转前以ARM模式运行,BLX指令将LR的位(0)设置为0;如果CPU在Thumb模式运行,则BLX指令将LR的位(0)设置为1

由于Cortex M4仅支持拇指指令模式(而非ARM模式),因此BLX将始终将位(0)设置为1

另一个选项是使用:MOV PC,LR,但这似乎违背了分支指令的目的

在没有拇指模式的旧ARM CPU上,
MOV-PC,LR
指令是“正式”返回指令

缺点是不能从手臂功能返回拇指功能,反之亦然


在只支持拇指模式的CPU上,您也可以使用该指令。

谢谢。ARM网站上没有任何文件表明LR返回地址保存了处理器的当前指令执行模式。他们只说地址被保存了。这似乎是一个明显的疏忽。其他地方也有记录,因为它不是LR特有的。跳转到Thumb指令总是跳转到奇数地址(同样,跳转到ARM指令总是跳转到偶数地址)。@FourierFlux不幸的是,ARM网站没有真正的文档。有关详细信息,如您需要ARM体系结构参考手册中的哪些说明,该手册仅适用于“注册ARM客户”。@RossRidge在ARM网站上,该体系结构手册仅适用于注册客户。但是,它可以从下载,例如,无需注册。@FourierFlux从纸质建筑参考手册到目前首次以数字方式提供的版本,都表明LR lsbit包含该模式。例如,LR=(下一条指令的地址)| 1和LR=PC:'1';非常感谢。ARM网站上没有任何文件表明LR返回地址保存了处理器的当前指令执行模式。他们只说地址被保存了。这似乎是一个明显的疏忽。其他地方也有记录,因为它不是LR特有的。跳转到Thumb指令总是跳转到奇数地址(同样,跳转到ARM指令总是跳转到偶数地址)。@FourierFlux不幸的是,ARM网站没有真正的文档。有关详细信息,如您需要ARM体系结构参考手册中的哪些说明,该手册仅适用于“注册ARM客户”。@RossRidge在ARM网站上,该体系结构手册仅适用于注册客户。但是,它可以从下载,例如,无需注册。@FourierFlux从纸质建筑参考手册到目前首次以数字方式提供的版本,都表明LR lsbit包含该模式。例如,LR=(下一条指令的地址)| 1和LR=PC:'1';谁是基于Cortex-M4的微控制器的供应商?TI,我在使用启动板。谁是基于Cortex-M4的微控制器的供应商?TI,我在使用启动板。