首发于CPU设计

ARM V8指令集中的跳转指令

一、概述

个人以为,RISC中不同指令的跳转指令都大同小异,主要分为无条件跳转指令,有条件跳转指令。有条件跳转指令的方式很固定,而无条件跳转指令包括4种指令:1.直接跳 2.链接跳 3.间接跳 4.返回跳,它们可以相互组合使用。

二、ARM跳转指令集列表

其中指令的关键字:B表示分支跳转指令,cond表示条件跳转,L表示链接,R表示从寄存器中查找跳转地址,RET则返回L类型保存的地址。

ARM指令集中的基本跳转指令

三、ARM跳转指令集详解

1、B型

(1)指令机器码

B指令的机器码

(2)汇编格式:B <label>

(3)跳转地址:bits(64) offset = SignExtend(imm26:‘00’, 64); BranchTo = PC + offset;

2、BL型

(1)指令机器码

BL指令的机器码

(2)汇编格式:BL <label>

(3)链接:X[30] = PC[] + 4

(4)跳转地址:bits(64) offset = SignExtend(imm26:‘00’, 64); BranchTo = PC + offset;

3、BR型

(1)指令机器码

BR指令机器码

(2)汇编格式:BR X<n>

(3)跳转地址:BranchTo = Rn[];

4、BLR型

(1)指令机器码

BLR指令机器码

(2)汇编格式:BLR X<n>

(3)跳转地址:BranchTo = Rn[];

5、RET型

(1)指令机器码

RET型指令

(2)汇编格式:RET X<n> ---若不指定寄存器,默认X<30>

(3)跳转地址:BranchTo = Rn[];

6、B.cond型

(1)指令机器码

B.cond指令机器码

(2)汇编格式:b.cond <lable>

(3)跳转地址:bits(64) offset = SignExtend(imm19:‘00’, 64); BranchTo = PC + offset;

7、CBZ型

(1)指令机器码

CBZ指令机器码

(2)汇编格式:CBZ <Xt>, <label>

(3)跳转条件:判定Rt寄存器的值为0则跳转

(4)跳转地址:bits(64) offset = SignExtend(imm19:‘00’, 64); BranchTo = PC + offset;

8、CBNZ型

(1)指令机器码

CBNZ指令的机器码

(2)汇编格式:CBNZ <Xt>, <label>

(3)跳转条件:判定Rt寄存器的值不为0则跳转

(4)跳转地址:bits(64) offset = SignExtend(imm19:‘00’, 64); BranchTo = PC + offset;

9、TBZ型

(1)指令机器码

TBZ指令机器码

(2)汇编格式:TBZ <R><t>, #<imm>, <label>

(3)跳转条件:Rt数据中的<b5:b40>位,如果 == op(也就是0),则发生跳转

(4)跳转地址:bits(64) offset = SignExtend(imm14:‘00’, 64); BranchTo = PC + offset;

10、TBNZ型

(1)指令机器码

TBNZ指令机器码

(2)汇编格式:TBNZ <R><t>, #<imm>, <label>

(3)跳转条件:Rt数据中的<b5:b40>位,如果 == op(也就是1),则发生跳转

(4)跳转地址:bits(64) offset = SignExtend(imm14:‘00’, 64); BranchTo = PC + offset;

四、功能总结

BranchTocondaddrd rwr r30
B.cond
CBNZ
CBZ
TBNZ
TBZ
B
BL
BLR
BR
RET

编辑于 2022-07-22 21:20