Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >RISC-V指令集讲解(5)条件和无条件跳转指令

RISC-V指令集讲解(5)条件和无条件跳转指令

原创
作者头像
IC知识库
修改于 2021-07-31 10:34:10
修改于 2021-07-31 10:34:10
24.8K0
举报
文章被收录于专栏:IC知识库平台IC知识库平台

1.控制转移指令

RV32I中控制转移指令主要有两类:无条件跳转和有条件跳转。

2.无条件跳转

无条件跳转指令均使用PC相对寻址。无条件跳转主要包括两条指令:JAL 和 JALR。

2.1 JAL

JAL指令是用J-type格式(JAL是RV32I中唯一J-type的指令)。

JAL的指令格式为 JAL rd,offset。x[rd] = pc+4; pc += sext(offset)

其机器码格式如图1所示。其opcode为110_1111。该指令把下一条指令的地址(PC + 4)存入rd寄存器中,然后把PC设置为当前值加上符号位扩展的偏移量。

图1 JAL机器编码格式 [1]

注意偏移量是带符号扩展的。可以看到偏移量是2字节对齐的(offset [20:1]),虽然RV32I中所有的指令地址都是4字节对齐的,但是JAL还可能被用于兼容C扩展指令集(详情见RISC-V 简介(4)RISC-V指令集编码结构中对其的描述),所以就默认offset  bit  0为0(即2字节对齐)。

因此,JAL跳转的地址有+/- 1MB的范围。(2^21 = 2MB = +/- 1MB)。

标准的软件调用约定(calling convention)用x1寄存器作为返回地址寄存器(rd),也可以用x5作为备用的链接寄存器(link register)。因为JAL指令中的offset是相对于PC的偏移量,在编写时需要精确的地址差值,且任意添加/删除一条汇编指令,JAL中的偏移量可能就需要再次修改,这给JAL指令的使用带来了很大的负担,所以,一般在用JAL指令时,多用JAL rd,label而不是JAL rd,offset。

JAL rd,label中的label是标签,用来标注某段程序的位置,为程序中跳转及分支语句提供的跳转入口(label使用实例可以点击这里)。编译器会自动计算出标签和当前指令的offset。

示例:

JAL x1,main 

伪指令:JAL main,对应的真实指令:JAL x1,main

伪指令:J main,对应的真实指令:JAL x0,main

跳转到main函数,并将下一条指令存在x1寄存器中

注意:

x5寄存器被选为备用的链接寄存器有两个原因:

在标准调用约定中被用作临时变量

它和常规链接器x1只有1 bit的区别 0_0001 –> 0_0101

当JAL指令省略rd时,默认rd即为x1。

伪指令J中rd为x0。

图1 JAL机器编码格式 [1]

2.2 JALR

间接跳转指令JALR用I-type编码类型。指令格式为JALR rd,offset(rs1)。

t = pc + 4;  pc = (x[rs1]+sext(offset)) & ~1;  x[rd]=t 相当于:

t = pc + 4;  pc = (x[rs1]+sext(offset)) & 0xffff_fffe;  x[rd]=t   // RV32I

其机器码如图2所示,其opcode为110_0111,funct3为000。

该指令将PC设置为rs1寄存器中的值加上符号位扩展的偏移量,把计算出地址的最低有效位设为0,并将原PC + 4的值写入rd寄存器。如果不需要目的寄存器,可以将rd设置为x0。

JALR的offset也是带符号位扩展的,JALR偏移的地址范围在rs1寄存器中存储地址的+/- 2KB(2 ^ 12 = 4096 = 4 KB = +/- 2KB)。定义JALR指令是为了使两个指令序列可以在32位绝对地址范围内的任意位置跳转(因为JAL指令的跳转范围不够大)。

示例:

JALR x13,0(x1)

跳到x1寄存器里存储的地址,并将下一条指令存在x13寄存器中。

其他伪指令示例:

JR  x1    =>  JALR x0, x1, 0

RET       => JALR x0, x1, 0

JALR x13   => JALR x1, x13, 0

一般来说,LUI和JALR配合使用可以跳转32位绝对地址范围,AUIPC和JALR配合可以跳转32位相对于PC的地址范围。

图2 JALR机器编码格式 [1]

3.有条件分支跳转

所有的分支指令都是B-type编码格式,其机器码如图3所示。12位的立即数以2字节的倍数编码带符号的偏移量(offset[12:1])。

虽然RV32I中所有的指令地址都是4字节对齐的,但是JAL还可能被用于兼容C扩展指令集,所以就默认offset  bit  0为0(即2字节对齐)。

目标地址由分支指令的地址加上符号位扩展的偏移量组成,范围是2^13 = 8192 = 8 KB = +/- 4 KB。

与JAL类似,Branch指令常见用法也可以用标签代替偏移量,比如BEQ rs1,rs2,label。

图3 branch指令机器编码格式 [1]

3.1 BEQ

BEQ(branch if equal,相等时分支),其指令格式为BEQ rs1,rs2,offset。if (rs1 == rs2)   pc += sext(offset)

3.2 BNE

BNE(branch if not equal,不相等时分支),其指令格式为BNE rs1,rs2,offset。if (rs1 ≠ rs2) pc += sext(offset)

3.3 BLT

BLT(branch if less than,小于时分支),其指令格式为BLT rs1,rs2,offset。if (rs1 <s rs2) pc += sext(offset)

3.4 BLTU

BLTU(branch if less than,unsigned,无符号小于时分支),其指令格式为BLTU rs1,rs2,offset。if (rs1 <u rs2) pc += sext(offset)

3.5 BGE

BGE(branch if greater than or equal,大于等于时分支),其指令格式为BGE rs1,rs2,offset。if (rs1 ≥s rs2) pc += sext(offset)

3.6 BGEU

BGEU(branch if greater than or equal,unsigned,大于等于时分支),其指令格式为BGEU rs1,rs2,offset。if (rs1 ≥u rs2) pc += sext(offset)

备注:关于分支指令的其他完整示例介绍内容,请搜索引擎搜索“IC知识库”查看。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
RISC-V指令集讲解(3)I-Type 移位指令和U-type指令
上文RISC-V指令集讲解 (2) I-Type整数寄存器-立即数指令介绍了I-type中的6个指令,本文将继续介绍I-type中其余的整数寄存器-立即数指令(这里是属于I-type的移位指令)和U-type中的整数寄存器-立即数指令。
IC知识库
2021/07/30
2.3K0
RISC-V指令集讲解(3)I-Type 移位指令和U-type指令
RISC-V指令集讲解(6)load/store指令
RV32I是一个加载-存储(load-store)架构。也是只有load和store指令才能访问存储器和外设(CPU 内的寄存器只能由算术指令操作) [1]。load和store指令将寄存器和存储器/外设的值相互交换。
IC知识库
2021/07/31
7.7K0
RISC-V指令集讲解(6)load/store指令
RISC-V指令集讲解(4)R-Type 整数寄存器-寄存器指令
上文RISC-V指令集讲解(3)I-Type 移位指令和U-type指令介绍完了整数寄存器-立即数指令,本文开始进行整数寄存器-寄存器指令的讲解。
IC知识库
2021/07/30
6.4K0
RISC-V指令集讲解(4)R-Type 整数寄存器-寄存器指令
RISC-V指令集讲解(2)I-Type整数寄存器-立即数指令
上文RISC-V指令集讲解 (1) 通用寄存器和汇编指令分类介绍了通用寄存器,程序计数器和6种汇编指令,本文将先从I-type的整数寄存器指令开始,详细介绍每一种汇编指令包括的具体指令。
IC知识库
2021/07/30
2.5K1
RISC-V指令集讲解(2)I-Type整数寄存器-立即数指令
RISC-V指令集讲解(1)通用寄存器和汇编指令分类
本文将开始详细讲解RISC-V指令集。CPU中包含32个通用寄存器,有时候也会被称为通用寄存器文件,如图1所示。通用寄存器的命名方式为X0-X31。其中第一个寄存器X0的值,被硬连线到0,因此值永远是0。其他寄存器X1-X31都是可读可写的。0-31也叫做索引号,索引号也可以理解为寄存器的地址,当指令需要调用通用寄存器时可以通过索引号查找。之后将会在介绍FPGA程序时讲解如何设计读写寄存器文件。对于32位系统,所有通用寄存器的宽度都是32bit,寄存器总个数也是32个。
IC知识库
2021/07/30
3.3K2
RISC-V指令集讲解(1)通用寄存器和汇编指令分类
riscv gcc中添加custom自定义指令
在riscv的处理器开发过程中,各家处理器往往都会涉及到自定义指令功能的添加。在处理器设计上,添加一些特定功能的指令是十分正常的,一般处理办法本文会讲述,让其识别客户自定义的指令。从现有的解决办法上来看,第一种是可以利用Kito Cheng提供的.insn模板进行开发,第二种则是修改binutils的方法。本文主要介绍这两种办法进行riscv custom指令的添加。
bigmagic
2021/10/09
5K0
从零开始写RISC-V处理器
第一次听到RISC-V这个词大概是两年前,当时觉得它也就是和MIPS这些CPU架构没什么区别,因此也就不以为然了。直到去年,RISC-V这个词开始频繁地出现在微信和其他网站上,此时我再也不能无动于衷了,于是开始在网上搜索有关它的资料,开始知道有SiFive这个网站,知道SiFive出了好几款RISC-V的开发板。可是最便宜的那一块开发板都要700多RMB,最后还是忍痛出手了一块。由于平时上班比较忙,所以玩这块板子的时间并不多,也就是晚上下班后和周末玩玩,自己照着芯片手册写了几个例程在板子上跑跑而已。
数字积木
2021/04/15
2K0
RISC-V 学习笔记:由来、基础整数指令集、汇编语言、特权架构
github地址:https://github.com/yunwei37/os-summer-of-code-daily
云微
2023/02/11
1.1K0
RISC-V 汇编语言程序设计(2)汇编程序asm_run_led
LI x8, 0xf0000000; # 设置gpio address;
IC知识库
2021/08/03
1.6K0
RISC-V 汇编语言程序设计(2)汇编程序asm_run_led
『计算机的组成与设计』-指令:计算机的语言
计算机语言中的基本单词称为指令。一台计算机的全部指令称为该计算机的指令集。 尽管机器语言种类繁多,但他们之间十分相似,其差异性更像人类语言的”方言”。 本篇讲解 MIPS 指令集。
1ess
2021/10/29
3K0
『计算机的组成与设计』-指令:计算机的语言
riscv实现自定义指令并用qemu运行
riscv支持指令集自定义扩展,这大大增加了riscv的可玩性,同时对于一些实际应用中,自己通过一条指令来实现特定的功能,效率非常高,当然,前提是硬件平台需要对该指令的支持。
bigmagic
2021/04/30
4.1K4
ARM指令集介绍「建议收藏」
ARM 指令集是针对ARM体系架构设计的指令。在BootLoader引导的第一阶段以及内核的第一阶段都会有一个使用汇编语言编写的文件,在不跑操作系统的裸板中也有一段用来初始化开发板环境的汇编代码。所以无论是开发带操作系统的板子,还是裸板开发,汇编语言都很有必要学习一番,最少要了解一些常用的汇编指令。要想设计出性能超强的系统,ARM的工作原理是必须掌握的。
全栈程序员站长
2022/11/15
2.7K0
ARM指令集介绍「建议收藏」
汇编语言之ARM32汇编
以上两种编译环境,使用的指令集都是一致的, 只是语法格式有不同,也就是宏指令,伪指令,伪操作不一样
乱码三千
2021/08/24
3.3K0
汇编语言之ARM32汇编
Dalvik指令集
对于 Android 4.4 之前的系统, 可以在 Android 源码 davik/libdex/DexOpcodes.h中找到完整的Dalvik指令集。 对于 Android 4.4 及之后的以 ART 主导的系统, 可以在 Android 源码 art/runtime/dexinstuctionlist.h中找到完整的Dalvik指令集。
103style
2022/12/19
7250
【计算机组成与设计】Chisel取指和指令译码设计
输入位32bit的一个机器字,按照课本MIPS 指令格式,完成add、sub、lw、sw指令译码,其他指令一律译码成nop指令。输入信号名为Instr_word,对上述四条指令义译码输出信号名为add_op、sub_op、lw_op和sw_op,其余指令一律译码为nop;
叶茂林
2023/11/07
5960
【计算机组成与设计】Chisel取指和指令译码设计
【系统架构设计师】计算机组成与体系结构 ⑬ ( 计算机指令集架构 | CISC 与 RISC | 复杂指令集架构 - CISC | 精简指令集架构 - RISC )
计算机指令集架构 ( ISA , Instruction Set Architecture ) 定义了 计算机 如何 执行 和 操作 指令 , 计算机 可 执行的 所有指令的集合 ;
韩曙亮
2024/07/14
2490
RISC-V 汇编语言程序设计(4)汇编语言格式及ABI
.globl(注意不是.global)用来声明全局标签,可从其它的文件访问,比如上面代码中.globl定义了_start,那么如果工程中其他的文件需要跳转到_start地址,可以直接使用
IC知识库
2021/08/03
1.5K0
RISC-V 汇编语言程序设计(4)汇编语言格式及ABI
rust写操作系统 rCore tutorial 学习笔记:实验指导一 中断
这是 os summer of code 2020 项目每日记录的一部分: 每日记录github地址(包含根据实验指导实现的每个阶段的代码):https://github.com/yunwei37/os-summer-of-code-daily
云微
2023/02/11
6570
手把手教你设计CPU(蜂鸟书)读书笔记
这本书讲的是如何用verilog,以riscv为指令集,设计一款CPU。也就是书中说的蜂鸟E200。之前没有看过类似的书,对CPU的工作流程也不熟悉。这本书以verilog为载体,介绍了CPU的基本原理,对于第一次接触CPU内部眼里的菜鸟来说,简直不要太神奇。而且本书开源代码,只要有一块fpga,你也能够自己做出一块CPU来。
用户1148523
2020/06/11
1.7K0
手把手教你设计CPU(蜂鸟书)读书笔记
计算机组织结构(十三) 指令集:寻址方式和指令格式
📚 文档目录 合集-数的二进制表示-定点运算BCD 码-浮点数四则运算-内置存储器-Cache-外存-纠错-RAID-内存管理-总线-指令集: 特征- 指令集:寻址方式和指令格式 表示: A: 指令中地址字段的内容 R: 指向寄存器的指令字段的内容 EA: 被访问未知的实际(有效)地址 (X): 存储器位置 X 或者寄存器 X 的内容 立即寻址 (Immediate Addressing) 操作数存在于指令中: 操作数 = A 应用: 定义和使用常数, 或者设置变量的初始值. 优点: 获取操作书不需要访问存
Rikka
2022/01/18
9860
计算机组织结构(十三) 指令集:寻址方式和指令格式
推荐阅读
相关推荐
RISC-V指令集讲解(3)I-Type 移位指令和U-type指令
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档