繁体   English   中英

ARM Cortex M0 / M3 / M4:为什么PC在Thumb状态下总是偶数

[英]ARM Cortex M0/M3/M4:Why PC is always Even number in Thumb State

据我所知,ARM Cortex-M CPU始终处于Thumb状态,这意味着:

程序计数器指示的拇指状态为奇数(LSB = 1)。 分支到偶数地址将导致异常,因为不允许切换回ARM状态。

但是,当我使用CortexM0和M4 CPU时, PC始终是均匀的 每次分支时,LR记录PC + 1,每次返回时,PC都给出LR-1。

例如,如果lr = 0x0000_01D5,

执行

BX lr

然后PC应该是0x0000_01D5,而它给出0x0000_01D4。

这不可能吗?

任何评论将不胜感激。

Cortex-M4技术参考手册

2.3.1程序计数器

寄存器R15是程序计数器(PC)。

位[0]始终为0,因此指令始终与字或半字边界对齐。

PC读取不应返回奇数地址。 但是,当您写入PC ,值的LSB将加载到EPSR T位中。 Cortex-M3设备通用用户指南 - 2.1.3。 核心登记册

拇指状态

Cortex-M3处理器仅支持Thumb状态下的指令执行。 以下可以将T位清除为0:

 instructions BLX, BX and POP{PC} restoration from the stacked xPSR value on an exception return bit[0] of the vector value on an exception entry or reset. 

当T位为0时尝试执行指令会导致故障或锁定。 有关更多信息,请参阅锁定。

换句话说,您可以从PC读取偶数值,但在正常情况下无法写入这些值。

我也有这种困惑。 lsbit设置用于BX将使用地址的情况。 当它进入电脑本身时,它会被剥离。 如果你反汇编一些简单的pc相对寻址,它将演示正在发生的事情。

虽然有4,294,967,296 [2 ^ 32]个存储单元,但实际数据总线只有8位宽。

对于16位指令,每个指令加载需要2次内存访问:这是关于“Endian”的参数开始的地方。 无论您采用哪种方式,都会以第一个字节读取2个字节,地址以0结尾。

[叹气]如果ARM数据总线宽度为16 [或32]位,您可能会忘记PC中的位 - 并且指令空间有两倍[或四倍]。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM