ARM V7 A架构指令集部分---分支指令

表格 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 字节 -

备注解释

  1. 非零比较与分支、零比较与分支指令(CBNZ, CBZ)

    • 这些指令在 ARM 指令集中并不存在,仅在 Thumb 指令集中可用。
    • 它们允许在寄存器值为零或非零的情况下进行条件跳转。
  2. 调用子程序,更改指令集(BLX immediate)

    • 这里的范围是由 BLX 指令的指令集决定的,而不是被跳转指令的目标地址决定的。

其他内容说明

  • 加载和计算的地址分支

    • 可以通过 LDRLDM 和数据处理指令执行。详细信息请参考页面 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 通过 SJ2J1imm6, 和 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 通过 SI1I2imm10, 和 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),则执行这条指令

在这个例子中:

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值