7

据我了解,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。

这不是不可能吗?

任何评论将不胜感激。

4

3 回答 3

8

来自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但在正常情况下无法写入此类值。

于 2013-09-06T12:01:21.100 回答
4

我也有这种困惑。lsbit 是为 BX 将使用地址的情况设置的。lsbit 在进入 pc 本身时被剥离。如果您反汇编一些简单的 pc 相对寻址,将展示发生了什么。

于 2013-09-06T13:53:16.473 回答
-2

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

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

[叹气] 如果 ARM 数据总线是 16 [或 32] 位宽,您可以忘记 PC 中的位 - 并拥有双 [或四倍] 指令空间。

于 2014-08-29T07:31:05.160 回答