ARM Cortex M0/M3/M4:为什么Thumb状态下PC始终为偶数

9
据我所知,ARM Cortex-M处理器总是处于Thumb状态,这意味着:
当程序计数器为奇数时(LSB=1),表示处于Thumb状态。跳转到偶数地址会引发异常,因为不允许切换回ARM状态。
然而,在使用CortexM0和M4处理器时,PC始终为偶数。每次分支时,LR记录PC + 1,每次返回时,PC给出LR-1。
例如,如果lr = 0x0000_01D5,
执行
BX lr 则PC应该为0x0000_01D5,但实际上它给出的是0x0000_01D4。
这不是不可能吗?
感谢您的任何评论。
3个回答

10

来自Cortex-M4技术参考手册:

2.3.1 程序计数器

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

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

PC读取不应返回奇地址。但是,当你写入PC时,值的LSB被加载到EPSR T位。 来自Cortex-M3设备通用用户指南-2.1.3. 核心寄存器

Thumb state

The Cortex-M3 processor only supports execution of instructions in Thumb state. The following can clear the T bit to 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.

Attempting to execute instructions when the T bit is 0 results in a fault or lockup. See Lockup for more information.

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

4

我也有这个困惑。当地址将被BX使用时,lsbit会被设置。当它进入PC本身时,lsbit会被剥离。如果您反汇编一些简单的PC相对寻址,就可以演示发生了什么。


-2

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

对于16位指令,每个指令加载需要2次内存访问:这就是“Endian”争论的起源。无论以哪种方式排序,都会读取2个字节,第1个字节在以0结尾的地址处。

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


抱歉,这不仅完全没有回答问题,而且也是无稽之谈。所有的ARM核心都至少有32位宽的数据总线(即使在地址总线只有26位的30年前),即使是微小的Cortex-M0也不例外。详情请见:http://infocenter.arm.com/help/topic/com.arm.doc.ddi0432c/CJHGJEBC.html。 - Notlikethat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接