跳转至

指令编码(顶层与 16 位)

本章给出第 C2 章《指令规范》中 T32 指令集编码的顶层划分与 16 位编码分配。各小节给出解码字段取值与所对应子分组、指令的关系;指令名保持原样。

1. 顶层 T32 指令集编码

T32 指令流是一串半字对齐的半字。每条 T32 指令要么是该流中的单个 16 位半字,要么是由该流中两个连续半字组成的 32 位指令。

若正在解码的半字的位 [15:11] 为以下之一,则该半字是 32 位指令的第一个半字:

  • 0b11101。
  • 0b11110。
  • 0b11111。

否则,该半字是 16 位指令。

FigureC2-1

下表给出解码字段取值与所关联的子分组:

op0 op1 子分组
!= 111 - 16 位 T32 指令编码
111 != 00 32 位 T32 指令编码

下表给出解码字段取值与所关联的指令:

op0 op1 指令
111 00 B T2

2. 16 位 T32 指令编码

本节描述 16 位 T32 指令编码的编码方式。本节由顶层 T32 指令集编码解码。

FigureC2-2

下表给出解码字段取值与所关联的子分组:

op0 子分组
00xxxx (立即数)移位、加、减、移动与比较
010000 数据处理(两个低寄存器)
010001 特殊数据指令以及分支与交换
0101xx 加载/存储(寄存器偏移)
011xxx 加载/存储字/字节(立即数偏移)
1000xx 加载/存储半字(立即数偏移)
1001xx 加载/存储(SP 相对)
1010xx 加 PC/SP(立即数)
1011xx 杂项 16 位指令
1100xx 加载/存储多寄存器
1101xx 条件分支与超级用户调用

下表给出解码字段取值与所关联的指令:

op0 指令
01001x LDR (literal) T1

2.1 (立即数)移位、加、减、移动与比较

本节描述(立即数)移位、加、减、移动与比较的编码方式。本节由 16 位 T32 指令编码解码。

FigureC2-3

下表给出解码字段取值与所关联的子分组:

op0 op1 op2 子分组
0 11 0 加、减(三个低寄存器)
0 11 1 加、减(两个低寄存器与立即数)
1 - - 加、减、比较、移动(一个低寄存器与立即数)

下表给出解码字段取值与所关联的指令:

op0 op1 op2 指令 别名
Alias ASRS (immediate) T2 ASR (immediate) T2
LSLS (immediate) T2 LSL (immediate) T2
LSRS (immediate) T2 LSR (immediate) T2
0 != 11 - MOV (register) T2

2.1.1 加、减(三个低寄存器)

本节描述加、减(三个低寄存器)的编码方式。本节由(立即数)移位、加、减、移动与比较解码。

FigureC2-4

下表给出解码字段取值与所关联的指令:

S 指令
0 ADD (register) T1
1 SUB (register) T1

2.1.2 加、减(两个低寄存器与立即数)

本节描述加、减(两个低寄存器与立即数)的编码方式。本节由(立即数)移位、加、减、移动与比较解码。

FigureC2-5

下表给出解码字段取值与所关联的指令:

S 指令
0 ADD (immediate) T1
1 SUB (immediate) T1

2.1.3 加、减、比较、移动(一个低寄存器与立即数)

本节描述加、减、比较、移动(一个低寄存器与立即数)的编码方式。本节由(立即数)移位、加、减、移动与比较解码。

FigureC2-6

下表给出解码字段取值与所关联的指令:

op 指令
00 MOV (immediate) T1
01 CMP (immediate) T1
10 ADD (immediate) T2
11 SUB (immediate) T2

2.2 数据处理(两个低寄存器)

本节描述数据处理(两个低寄存器)的编码方式。本节由 16 位 T32 指令编码解码。

FigureC2-7

下表给出解码字段取值与所关联的指令:

op 指令
0000 AND (register) T1
0001 EOR (register) T1
Alias LSL (register) T1
Alias LSLS (register) T1
Alias LSR (register) T1
Alias LSRS (register) T1
Alias ASR (register) T1
Alias ASRS (register) T1
0101 ADC (register) T1
0110 SBC (register) T1
Alias ROR (register) T1
Alias RORS (register) T1
1000 TST (register) T1
1001 RSB (immediate) T1
1010 CMP (register) T1
1011 CMN (register) T1
1100 ORR (register) T1
1101 MUL T1
1110 BIC (register) T1
1111 MVN (register) T1
0010
0011
0100
0111

2.3 特殊数据指令以及分支与交换

本节描述特殊数据指令以及分支与交换的编码方式。本节由 16 位 T32 指令编码解码。

FigureC2-8

下表给出解码字段取值与所关联的子分组:

op0 子分组
11 分支与交换
!= 11 加、减、比较、移动(两个高寄存器)

2.3.1 分支与交换

本节描述分支与交换的编码方式。本节由特殊数据指令以及分支与交换解码。

FigureC2-9

下表给出解码字段取值与所关联的指令:

L 指令
0 BX, BXNS T1
1 BLX, BLXNS T1

2.3.2 加、减、比较、移动(两个高寄存器)

本节描述加、减、比较、移动(两个高寄存器)的编码方式。本节由特殊数据指令以及分支与交换解码。

FigureC2-10

下表给出解码字段取值与所关联的指令:

D:Rd Rs op 指令
!= 1101 != 1101 00 ADD (register) T2
- 1101 00 ADD (SP plus register) T1
1101 != 1101 00 ADD (SP plus register) T2
- - 01 CMP (register) T2
- - 10 MOV (register) T1

2.4 加载/存储(寄存器偏移)

本节描述加载/存储(寄存器偏移)的编码方式。本节由 16 位 T32 指令编码解码。

FigureC2-11

下表给出解码字段取值与所关联的指令:

B H L 指令
0 0 0 STR (register) T1
0 1 0 STRH (register) T1
1 0 0 STRB (register) T1
1 1 0 LDRSB (register) T1
0 0 1 LDR (register) T1
0 1 1 LDRH (register) T1
1 0 1 LDRB (register) T1
1 1 1 LDRSH (register) T1

2.5 加载/存储字/字节(立即数偏移)

本节描述加载/存储字/字节(立即数偏移)的编码方式。本节由 16 位 T32 指令编码解码。

FigureC2-12

下表给出解码字段取值与所关联的指令:

B L 指令
0 0 STR (immediate) T1
0 1 LDR (immediate) T1
1 0 STRB (immediate) T1
1 1 LDRB (immediate) T1

2.6 加载/存储半字(立即数偏移)

本节描述加载/存储半字(立即数偏移)的编码方式。本节由 16 位 T32 指令编码解码。

FigureC2-13

下表给出解码字段取值与所关联的指令:

L 指令
0 STRH (immediate) T1
1 LDRH (immediate) T1

2.7 加载/存储(SP 相对)

本节描述加载/存储(SP 相对)的编码方式。本节由 16 位 T32 指令编码解码。

FigureC2-14

下表给出解码字段取值与所关联的指令:

L 指令
0 STR (immediate) T2
1 LDR (immediate) T2

2.8 加 PC/SP(立即数)

本节描述加 PC/SP(立即数)的编码方式。本节由 16 位 T32 指令编码解码。

FigureC2-15

下表给出解码字段取值与所关联的指令:

op 指令
Alias ADD (immediate, to PC) T1
0 ADR T1
1 ADD (SP plus immediate) T1

2.9 杂项 16 位指令

本节描述杂项 16 位指令的编码方式。本节由 16 位 T32 指令编码解码。

FigureC2-16

下表给出解码字段取值与所关联的子分组:

op0 op1 op2 op3 子分组
0000 - - - 调整 SP(立即数)
0010 - - - 扩展
1010 != 10 - - 反转字节
1111 - - 0000 提示
x10x - - - 压栈与出栈

下表给出解码字段取值与所关联的指令:

op0 op1 op2 op3 指令
0110 01 1 - CPS T1
1110 - - - BKPT T1
1111 - - != 0000 IT T1
x0x1 - - - CBNZ, CBZ T1

2.9.1 调整 SP(立即数)

本节描述调整 SP(立即数)的编码方式。本节由杂项 16 位指令解码。

FigureC2-17

下表给出解码字段取值与所关联的指令:

S 指令
0 ADD (SP plus immediate) T2
1 SUB (SP minus immediate) T1

2.9.2 扩展

本节描述扩展的编码方式。本节由杂项 16 位指令解码。

FigureC2-18

下表给出解码字段取值与所关联的指令:

B U 指令
0 0 SXTH T1
1 0 SXTB T1
0 1 UXTH T1
1 1 UXTB T1

2.9.3 反转字节

本节描述反转字节的编码方式。本节由杂项 16 位指令解码。

FigureC2-19

下表给出解码字段取值与所关联的指令:

op 指令
00 REV T1
01 REV16 T1
11 REVSH T1

2.9.4 提示

本节描述提示的编码方式。本节由杂项 16 位指令解码。

FigureC2-20

下表给出解码字段取值与所关联的指令:

hint 指令
0000 NOP T1
0001 YIELD T1
0010 WFE T1
0011 WFI T1
0100 SEV T1
0101 保留提示,表现为 NOP
011x 保留提示,表现为 NOP
1xxx 保留提示,表现为 NOP

2.9.5 压栈与出栈

本节描述压栈与出栈的编码方式。本节由杂项 16 位指令解码。

FigureC2-21

下表给出解码字段取值与所关联的指令:

L 指令
1 LDM, LDMIA, LDMFD T3
Alias POP (multiple registers) T3
Alias PUSH (multiple registers) T2
0 STMDB, STMFD T2

2.10 加载/存储多寄存器

本节描述加载/存储多寄存器的编码方式。本节由 16 位 T32 指令编码解码。

FigureC2-22

下表给出解码字段取值与所关联的指令:

L 指令
1 LDM, LDMIA, LDMFD T1
0 STM, STMIA, STMEA T1

2.11 条件分支与超级用户调用

本节描述条件分支与超级用户调用的编码方式。本节由 16 位 T32 指令编码解码。

FigureC2-23

下表给出解码字段取值与所关联的子分组:

op0 子分组
111x 异常生成

下表给出解码字段取值与所关联的指令:

op0 指令
!= 111x B T1

2.11.1 异常生成

本节描述异常生成的编码方式。本节由条件分支与超级用户调用解码。

FigureC2-24

下表给出解码字段取值与所关联的指令:

S imm8 指令
0 - UDF T1
1 - SVC T1