RV32I 基本指令集汇编解析
RV32I 基本指令集汇编解析@cctvjack
本文为作者自学RV用户指令集手册中RV32I基本指令集及其汇编格式的内容,参考RV 用户指令集手册。https://riscv.org/specifications/
还找到了中文版本的https://www.cnblogs.com/mikewolf2002/p/9654946.html
寄存器ABI名字
X0 zero
【21条】 整数计算指令,使用I类型(一个立即数和一个寄存器作为操作数),或者R类型(两个寄存器作为操作数),没有整数计算指令会导致算数异常。
整数 寄存器-立即数 指令
- addi rd, rs1, imm 表示将一个符号扩展的12bit imm加上rs1寄存器内容,然后写入rd寄存器,addi rd, rs1, 0 = mv rd, rs1
- slti rd, rs1, imm,表示set less than imm,表示如果rs1中的内容小于符号位扩展的12bit imm,那么rd就会被置1,否则置0.
- Sltiu rd, rs1, imm,表示小于立即数置1,u的意思是立即数当做无符号数,即立即数被符号位扩展之后,当做无符号数使用。注意,sltiu rd, rs1, 1,当rs1等于0的时候rd 置1,否则置0,这个指令功能与seqz rd rs,即等于0置1一样。
- Andi rd, rs1, imm,表示寄存器内容与立即数做按位与操作,结果写入rd
- Ori rd, rs1, imm,表示寄存器内容与立即数做按位或操作,结果写入rd
- Xori rd, rs1, imm,表示寄存器内容与立即数做按位异或操作,结果写入rd,注意,xori rd, rs1, -1执行的是按位取反操作,功能与not rd, rs一样。
移位一个常数位置,使用I指令,将rs1中的数进行移位 - Slli rd, rs1, imm表示shift left logical imm,将rs1中的数,逻辑左移imm这么多位数,逻辑移位的话都是填充0.
- Srli rd, rs1, imm表示shift right logical imm,表示逻辑右移,也是填充0
- Srai rd, rs1, imm表示shift right arithmetic imm,表示算数右移,即右移的时候,填充符号位。
U型指令
- Lui rd, imm表示load upper imm,用于构建32位立即数到rd中,低12位填充0,高20位是imm。注意,汇编的时候,imm的值只是立即数的高20位,低20位还要填充0.特别注意。
- Auipc rd, imm,add upper imm to pc,表示将立即数低12位填充0,构建32位偏移,然后加到这条auipc指令的pc上,然后写到rd里。注意auipc加上一条有12位立即数的jalr指令,可以跳到32位地址下的任意位置。
整数 寄存器-寄存器操作 R型 将rs1 rs2 做算数操作,然后写入rd
- Add rd, rs1, rs2 加法操作,忽略溢出
- slt rd, rs1, rs2 set less than rs1<rs2 就置1
- sltu rd, rs1, rs2 set less than 无符号比较
- and rd, rs1, rs2 按位与,逻辑与
- or rd, rs1, rs2 按位或,逻辑或
- xor rd, rs1, rs2 按位异或
- sll rd, rs1, rs2 shift left logical
- srl rd, rs1, rs2 shift right logical
- sub rd, rs1, rs2 减法
- sra rd, rs1, rs2 shift right arithmetic 算数右移,填充符号位。
NOP 指令
NOP指令使用addi x0 x0 0实现。
【2条】 控制转移指令,两种,一种无条件跳转,一种有条件分支,RV32I没有显式的分支延迟槽。如果跳转发生了缺页或者访问故障,那么就会报告异常。
- Jal rd, imm, jump and link, imm有20位,所以可以寻址正负1MB地址。Jal将jump指令(pc+4)之后的地址写入rd,一般软件调用使用x1作为返回地址寄存器,x5作为可选链接寄存器。如果rd是x0的话,就是一个普通的无条件跳转。
- Jalr rd, rs1, imm, Jump and link register, 使用I类型指令,目标地址通过符号扩展12bit imm加上rs1的内容得到,再把结果最低位置0(2字节对齐?用于压缩指令?)jump指令的后一条指令地址(pc+4)写入rd,作为返回地址。X0可以做rd,如果不需要返回。
备注,JALR+LUI可以实现32位绝对地址跳转,LUI先加载高20位imm,然后用JALR加载低12位跳转地址,合成32位跳转地址。
如果JAL JALR生成的目标地址不是4字节对齐的,就会报异常。
返回地址堆栈,用于返回地址预测,根据不同寄存器号来标识不同含义。
【6条】 条件分支,使用B类型格式,offset符号扩展后加上分支指令的地址来生成目标地址。寻址范围正负4KB
- Beq rs1, rs2, imm branch equal
- Bne rs1, rs2, imm branch not equal
- Blt rs1, rs2, imm branch less than, rs1 < rs2
- Blt rs1, rs2, imm branch less than
- Bge rs1, rs2, imm branch greater than rs1 >= rs2
- Bgeu rs1, rs2, imm branch greater than
备注,RV下最好使用JAL WITH RD=X0来做无条件跳转而不是恒为真的分支指令。
同样的,如果分支条件成立且目标地址不是4字节对齐的,那么会报异常,否则不会
【8条】 Load store
load 到 x0不管怎么样都会引起异常。Load是I类型,而STORE是s类型
有效地址是rs1加上符号扩展的12位偏移。Load将内存的值加载到rd,store将rs2的值加载到内存。
- Lw rd, rs1 imm或者写作 lw rd imm(rs1) 加载一个32位的值到rd load word
- Lh rd rs1 imm 加载一个16位的值,然后符号扩展后到rd load half word
- Lhu rd rs1 imm加载16位,0扩展到32位到rd
- Lb rd rs1 imm 加载8位,符号扩展到rd load byte
- Lbu rd rs1 imm 加载8位,0扩展到rd
- Sw rs1, rs2 imm或者写作 sw rs2 imm(rs1) 加载寄存器的32位到内存 save word
- Sh rs1 rs2, imm 加载低16位到内存 save half word
- Sb rs1 rs2 imm 加载低8位到内存 save byte
存储顺序指令 fence 规定了一些读写输出输出顺序
- Fence
- Fence.I
环境调用和断点调试 ,使用I型
- Ecall rd rs1 给执行环境提供服务请求
- Ebreak rd rs1 返回控制调试环境
RV32I 基本指令集汇编解析相关推荐
- 【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )
文章目录 一.创建 Capstone 反汇编解析器实例对象 二.设置 Cs 汇编解析器显示细节 一.创建 Capstone 反汇编解析器实例对象 使用 Capstone 反汇编框架 , 首先创建 Ca ...
- 29.字节码指令集与解析
字节码指令集与解析 概述 java字节码对于虚拟机好像汇编语言对于计算机,属于基础执行指令 java虚拟机的指令由一个字节长度代表某种特定操作含义的数字(操作码Opcode)以及跟随其后的零至多个代表 ...
- arm汇编解析—tengine winograd_nhwc卷积实现
与xnn/qnn卷积的异同点 tengine中实现了NHWC的winograd,目前nhwc的卷积主要以xnn/qnn框架为典型,所以这里拿tengine中的U*V和xnn/qnn卷积做个比较,简单总 ...
- arm汇编解析—qnnpack卷积实现
目录 前言 基础直通车 arm基础知识 arm指令释义 qnn汇编代码解析 前言 最近在移植QNNPACK神经网络加速库,涉及到对卷积arm汇编的修改,这边做个记录,对汇编部分的内容进行注释,顺便学习 ...
- 10、字节码指令集与解析举例
文章目录 第1章.概述 1.执行模型 2.字节码与数据类型 3.指令分析 第2章.加载与存储指令 1.复习:操作数栈与局部变量表 [1]操作数栈(Operand Stacks) [2]局部变量表(Lo ...
- 第十九篇_字节码指令集与解析
文章目录 概述 执行模型 字节码与数据类型 指令分类 加载与存储指令 再谈操作数栈和局部变量表 局部变量压栈指令 常量入栈指令 出栈装入局部变量表 算术运算符指令以及举例 所有的运算符指令 比较指令的 ...
- Keil 汇编窗口无法设置断点,disassembly显示错误,Keil汇编解析错误
今天遇到一次Keil的汇编窗口(disassembly窗口)无法添加断点的情况.如下图,在0x0808AF3A和0x0808AF3E的地方都可以添加断点,再往下0x0808AF3F的地方一直往后面就无 ...
- 汇编解析(6)-二进制文件(嵌入式,纯二进制格式的文件)进行反汇编和汇编
二进制文件(嵌入式,纯二进制格式的文件) 除了nasm可以汇编,使用gas也可以的 (base) [myhaspl@localhost gasm]$ cat test3.asm .global _st ...
- 汇编解析(5)-intel的奔4的netburst控制单元技术提高指令处理速度
1.Intel NetBurst微处理器体系结构是Intel Xeon处理器和Intel Pentium处理器的基础.它的新功能和创新,使得IA-32处理器得以保持高性能.处理器的构架指的是程序员可用 ...
最新文章
- Linux kernel block device 的 submit_bio 都做了什么?
- 什么是重载or重写,二者的区别是?
- Android基站定位
- 微软推出《我的世界》“编程一小时”免费教程,携手Code.org普及计算机科学教育
- 内核同步机制之Mutex Exclusion
- android主题切换框架,Android主题切换日夜间模式与换肤框架小结
- Redis集群搭建与简单使用
- matlab打包多个m文件,MATLAB GUI多个m文件和fig如何生成exe文件
- 【线性代数】P3 拉普拉斯定理
- 卷积码树状图怎么画_卷积码状态图怎么画 卷积编码器状态图画法
- 随机过程的均值函数、自相关函数、协方差函数
- 抖抖.....抖个不停的伺服电机——转动惯量匹配技术及资料分享
- selenium自动登录qq空间
- l2tp 账户管理系统
- 关于应用界面引导性的设计模式
- ADB命令获取手机应用安装包
- python金融趋势指标计算:布林带
- 【Python黑科技】tkinter库实战制作一个记事本(保姆级图文+实现代码)
- VC++ RLE压缩算法(附源码)
- 高性能MySQL读书摘要(五)创建高性能的索引