[英]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。
这不可能吗?
任何评论将不胜感激。
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.