表格 Table A4-1 总结了 ARM 和 Thumb 指令集中的分支指令。这些分支指令除了实现程序流的改变外,有些指令还可以更改指令集。
表格 A4-1 分支指令
| 指令 | 参考页面 | Thumb 范围 | ARM 范围 |
|---|---|---|---|
| 跳转到目标地址 | B on page A8-332 | ±16MB | ±32MB |
| 非零比较与分支,零比较与分支 | CBNZ, CBZ on page A8-354 | 0-126 字节 | - |
| 调用子程序 | BL, BLX (immediate) on page A8-346 | ±16MB | ±32MB |
| 调用子程序,更改指令集 | BLX (immediate) on page A8-346 | ±16MB | ±32MB |
| 调用子程序,可选更改指令集 | BLX (register) on page A8-348 | 任意 | 任意 |
| 跳转到目标地址,更改指令集 | BX on page A8-350 | 任意 | 任意 |
| 切换到 Jazelle 状态 | BXJ on page A8-352 | - | - |
| 表分支(字节偏移量) | TBB, TBH on page A8-737 | 0-510 字节 | - |
| 表分支(半字偏移量) | TBB, TBH on page A8-737 | 0-131070 字节 | - |
备注解释
-
非零比较与分支、零比较与分支指令(CBNZ, CBZ):
- 这些指令在 ARM 指令集中并不存在,仅在 Thumb 指令集中可用。
- 它们允许在寄存器值为零或非零的情况下进行条件跳转。
-
调用子程序,更改指令集(BLX immediate):
- 这里的范围是由 BLX 指令的指令集决定的,而不是被跳转指令的目标地址决定的。
其他内容说明
-
加载和计算的地址分支:
- 可以通过
LDR、LDM和数据处理指令执行。详细信息请参考页面 A4-173 的加载/存储指令部分、A4-175 的多重加载/存储指令部分、A4-163 的标准数据处理指令部分以及 A4-165 的移位指令部分。
- 可以通过
-
除表 A4-1 中显示的分支指令外:
- 在 ARM 指令集中,指向程序计数器(PC)的数据处理指令会作为分支指令。
- 在 ARM 和 Thumb 指令集中,指向程序计数器的加载指令会作为分支指令。
总结
这张表列出了 ARM 和 Thumb 中不同的分支指令,说明了它们的跳转范围,以及在不同指令集下的一些特性。
在表格中,“Thumb 范围”和“ARM 范围”分别指的是指令在 Thumb 指令集 和 ARM 指令集 中所允许的跳转范围。
Thumb 指令集和 ARM 指令集的区别
- ARM 指令集:指 ARM 处理器的标准 32 位指令集。ARM 指令长度固定为 32 位,通常用于对性能和处理能力要求较高的应用场景。
- Thumb 指令集:是 ARM 架构的一个精简版 16 位指令集,旨在减少代码大小,主要用于存储空间有限或需要节能的场景。Thumb 指令的长度通常为 16 位,但也包含一些扩展的 32 位指令。
表中“Thumb 范围”和“ARM 范围”的意义
- 在 Thumb 指令集范围内:这是指该分支指令在 Thumb 模式 下的跳转距离。例如,
B指令在 Thumb 模式下的跳转范围是 ±16MB,表示它可以相对于当前指令地址,向前或向后跳转最多 16MB 的地址空间。 - 在 ARM 指令集范围内:这是指该分支指令在 ARM 模式 下的跳转距离。例如,
B指令在 ARM 模式下的跳转范围是 ±32MB,表示在 ARM 模式下它可以向前或向后跳转最多 32MB 的地址空间。
范围不同的原因
Thumb 和 ARM 指令集的跳转范围不同的主要原因是指令长度的不同:
- ARM 指令长度是 32 位,因此可以使用更多位来表示较大的偏移量,从而实现更大的跳转范围。
- Thumb 指令长度通常是 16 位(部分指令是扩展的 32 位),因此它在表示跳转偏移时受到更多限制,导致跳转范围通常比 ARM 模式小。
示例
在表格中:
B指令(无条件跳转指令)在 Thumb 模式下的跳转范围为 ±16MB,而在 ARM 模式下的跳转范围为 ±32MB。BL指令(跳转并链接,用于调用子程序)同样在 Thumb 模式下的跳转范围是 ±16MB,而在 ARM 模式下则是 ±32MB。
这个范围的差异影响了指令在不同指令集模式下可以跳转的最大距离。
这张图片展示了 ARM 指令集中的 B 指令的各种编码格式。B 指令是一种分支指令,用于跳转到指定的目标地址。不同的编码方式适用于不同的 ARM 架构版本,下面是每种编码格式的详细说明。
1. Encoding T1
应用示例
举个例子,如果有以下代码:
BEQ label ; 如果等于条件成立,跳转到 label
在这种情况下,BEQ 指令会根据条件码判断是否执行跳转。如果满足相等条件,则执行跳转。
- 适用版本:ARMv4T, ARMv5T*, ARMv6*, ARMv7
- 指令格式:
B<c> <label> - 编码:指令占用 16 位,结构如下:

- 解释:
cond表示条件码,如果cond为1110,则执行 UDF(Undefined),即产生未定义的指令异常。- 如果
cond为1111,则执行 SVC(Supervisor Call),触发系统调用。 imm32是通过扩展imm8位生成的 32 位立即数(符号扩展至 32 位)。- 限制:不允许在 IT 块(If-Then 块)中使用。如果出现在 IT 块中,则不可预测。
- 当执行
B<c> <label>指令时,处理器根据当前的条件码判断是否需要跳转到指定的标签(label)。 - 如果条件满足,目标地址会通过当前指令的地址加上符号扩展的
imm8计算得出,从而跳转到相应的指令。
2. Encoding T2
- 适用版本:ARMv4T, ARMv5T*, ARMv6*, ARMv7
- 指令格式:
B<c> <label> - 编码:指令占用 16 位,结构如下:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 1 1 0 0 imm11 - 解释:
imm32是通过扩展imm11位生成的 32 位立即数(符号扩展至 32 位)。- 限制:只允许出现在 IT 块的外部或 IT 块的最后一个指令位置。如果不符合要求,则不可预测。
3. Encoding T3
- 适用版本:ARMv6T2, ARMv7
- 指令格式:
B<c>.W <label> - 编码:指令占用 32 位,结构如下:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 1 1 1 0 S cond imm6 1 0 J1 J2 imm11 - 解释:
cond<3:1>不能全为111,否则需参见相关编码。imm32通过S,J2,J1,imm6, 和imm11位合成,并符号扩展至 32 位。- 限制:不允许在 IT 块中使用,出现在 IT 块中则不可预测。
4. Encoding T4
- 适用版本:ARMv6T2, ARMv7
- 指令格式:
B<c>.W <label> - 编码:指令占用 32 位,结构如下:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 1 1 1 0 S imm10 1 0 J1 J2 imm11 - 解释:
I1和I2位通过J1和J2位取反得出。imm32通过S,I1,I2,imm10, 和imm11位合成,并符号扩展至 32 位。- 限制:只允许在 IT 块的外部或 IT 块的最后一个指令位置。如果不符合要求,则不可预测。
5. Encoding A1
- 适用版本:ARMv4*, ARMv5T*, ARMv6*, ARMv7
- 指令格式:
B<c> <label> - 编码:指令占用 32 位,结构如下:
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 cond 1 0 1 0 imm24 - 解释:
- 当
cond为1111(即条件码为1111)时,需参考 A5-214 页的无条件指令。 imm32通过imm24位符号扩展至 32 位。
- 当
总结
这张图片展示了 ARM 指令集中的 B 指令在不同架构版本中的多种编码方式,包括如何计算偏移量、指令的条件码设置以及在 IT 块中的使用限制。不同的编码方式适用于不同的 ARM 架构,且在跳转范围和使用条件上有所不同。
在 ARM Thumb 指令集中,IT 区块(IT Block) 是一种用于条件执行的一组指令。IT 区块中的指令可以根据条件代码来决定是否执行。IT 是 If-Then 的缩写,表示“如果-那么”条件结构,用于支持 Thumb 状态下的条件执行。
IT 区块的用途
在 ARM 指令集中,许多指令可以带有条件码来决定是否执行(例如条件跳转指令 B<cond>)。然而,Thumb 指令集为了精简编码长度,原本不支持复杂的条件执行。引入 IT 区块可以使 Thumb 指令也能够根据条件选择性地执行,从而接近 ARM 指令的灵活性。
IT 指令
- IT 指令的格式是
IT <条件码>,后面可以跟一个字母序列,表示条件执行的指令数量和结构。 - 例如,
ITTE表示包含 3 条指令的 IT 区块,其中第一条指令执行“如果”条件,接下来的两条执行“否则”条件。
IT 区块的使用规则
- 最多包含 4 条指令:IT 区块最多可以包含 4 条 Thumb 指令,每条指令根据 IT 指令指定的条件来决定是否执行。
- 指令条件设置:IT 区块中每条指令的执行条件由 IT 指令的后缀决定,IT 指令会使用一个 4 位的掩码来控制 IT 区块中每条指令的执行情况。
- 连续性:IT 区块必须是连续的,且所有指令必须在 IT 指令之后紧跟。
IT 区块中的限制
- 并非所有 Thumb 指令都可以放在 IT 区块中。某些特定的指令在 IT 区块中不可用。
- 例如,
B指令(跳转指令)在 IT 区块中一般受到限制,因为分支指令会中断 IT 区块的执行逻辑。
示例
假设我们有一个 IT 区块,条件为 EQ(相等条件):
IT EQ ; 定义一个 IT 区块,条件为 "相等" MOVEQ R0, #1 ; 如果满足条件(EQ),则执行这条指令 MOVNE R0, #0 ; 如果不满足条件(NE),则执行这条指令
在这个例子中:
<

7319

被折叠的 条评论
为什么被折叠?



