请教 ARM LDM 指令读数据到 PC 寄存器的一个问题

2021-06-08 19:22:40 +08:00
 ciichen

最近在学 ARM 汇编,看到 LDM 指令的时候有个问题看不懂了。

Loading to the PC
A load to the PC causes a branch to the instruction at the address loaded.

In ARMv4, bits[1:0] of the address loaded must be 0b00.

In ARMv5T and above:

bits[1:0] must not be 0b10

  • if bit[0] is 1, execution continues in Thumb state
  • if bit[0] is 0, execution continues in ARM state.

这是ARM官方对 LDM 指令读数据 PC 寄存器的描述。

为什么 bit[0] 置 1 之后,接下来就进到 Thumb 模式继续执行了呢。Tumb 指令两字节对齐,bit[0] 应该也是 0 吧。

1003 次点击
所在节点   嵌入式开发
3 条回复
churchmice
2021-06-08 19:52:31 +08:00
我来给你解释一下
不论如何地址都是需要 16bit 对齐的,所以硬件在去 memory load 代码的时候是强制把 bit[0]干成 0 的,也就是说 bit[0]在取值的时候就没有意义了,但是可以包含其他的信息,这个信息就是接下来 cpu 处于什么状态

00: ARM state
01: thumb state
10: bit[0] ==0 ,代表是 ARM state, 要求地址 32 对齐,所以这个是非法的 encoding
11: thumb state
churchmice
2021-06-08 19:57:23 +08:00
当然你可以跟我争辩 10 的 encoding 也可以表明是 arm state,硬件在做的时候直接忽略低 2bit 就可以了
但是你这样做会增加硬件复杂性,虽然只是一丢丢,但是会影响到 cpu 频率的提升,所以硬件是不会做这个额外的事情的
ciichen
2021-06-08 23:12:20 +08:00
@churchmice 多谢!现在知道了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/782239

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX