ARM V8指令集中的跳转指令
一、概述
个人以为,RISC中不同指令的跳转指令都大同小异,主要分为无条件跳转指令,有条件跳转指令。有条件跳转指令的方式很固定,而无条件跳转指令包括4种指令:1.直接跳 2.链接跳 3.间接跳 4.返回跳,它们可以相互组合使用。
二、ARM跳转指令集列表
其中指令的关键字:B表示分支跳转指令,cond表示条件跳转,L表示链接,R表示从寄存器中查找跳转地址,RET则返回L类型保存的地址。
三、ARM跳转指令集详解
1、B型
(1)指令机器码
(2)汇编格式:B <label>
(3)跳转地址:bits(64) offset = SignExtend(imm26:‘00’, 64); BranchTo = PC + offset;
2、BL型
(1)指令机器码
(2)汇编格式:BL <label>
(3)链接:X[30] = PC[] + 4
(4)跳转地址:bits(64) offset = SignExtend(imm26:‘00’, 64); BranchTo = PC + offset;
3、BR型
(1)指令机器码
(2)汇编格式:BR X<n>
(3)跳转地址:BranchTo = Rn[];
4、BLR型
(1)指令机器码
(2)汇编格式:BLR X<n>
(3)跳转地址:BranchTo = Rn[];
5、RET型
(1)指令机器码
(2)汇编格式:RET X<n> ---若不指定寄存器,默认X<30>
(3)跳转地址:BranchTo = Rn[];
6、B.cond型
(1)指令机器码
(2)汇编格式:b.cond <lable>
(3)跳转地址:bits(64) offset = SignExtend(imm19:‘00’, 64); BranchTo = PC + offset;
7、CBZ型
(1)指令机器码
(2)汇编格式:CBZ <Xt>, <label>
(3)跳转条件:判定Rt寄存器的值为0则跳转
(4)跳转地址:bits(64) offset = SignExtend(imm19:‘00’, 64); BranchTo = PC + offset;
8、CBNZ型
(1)指令机器码
(2)汇编格式:CBNZ <Xt>, <label>
(3)跳转条件:判定Rt寄存器的值不为0则跳转
(4)跳转地址:bits(64) offset = SignExtend(imm19:‘00’, 64); BranchTo = PC + offset;
9、TBZ型
(1)指令机器码
(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)指令机器码
(2)汇编格式:TBNZ <R><t>, #<imm>, <label>
(3)跳转条件:Rt数据中的<b5:b40>位,如果 == op(也就是1),则发生跳转
(4)跳转地址:bits(64) offset = SignExtend(imm14:‘00’, 64); BranchTo = PC + offset;
四、功能总结
BranchTo | cond | add | rd r | wr r30 | |
B.cond | √ | √ | √ | ||
CBNZ | √ | √ | √ | ||
CBZ | √ | √ | √ | ||
TBNZ | √ | √ | √ | ||
TBZ | √ | √ | √ | ||
B | √ | √ | |||
BL | √ | √ | √ | ||
BLR | √ | √ | √ | ||
BR | √ | √ | |||
RET | √ | √ |