RV32I 基本指令集汇编解析@cctvjack

本文为作者自学RV用户指令集手册中RV32I基本指令集及其汇编格式的内容,参考RV 用户指令集手册。https://riscv.org/specifications/

还找到了中文版本的https://www.cnblogs.com/mikewolf2002/p/9654946.html

寄存器ABI名字

X0 zero

【21条】 整数计算指令,使用I类型(一个立即数和一个寄存器作为操作数),或者R类型(两个寄存器作为操作数),没有整数计算指令会导致算数异常。

整数 寄存器-立即数 指令

  1. addi rd, rs1, imm 表示将一个符号扩展的12bit imm加上rs1寄存器内容,然后写入rd寄存器,addi rd, rs1, 0 = mv rd, rs1
  2. slti rd, rs1, imm,表示set less than imm,表示如果rs1中的内容小于符号位扩展的12bit imm,那么rd就会被置1,否则置0.
  3. Sltiu rd, rs1, imm,表示小于立即数置1,u的意思是立即数当做无符号数,即立即数被符号位扩展之后,当做无符号数使用。注意,sltiu rd, rs1, 1,当rs1等于0的时候rd 置1,否则置0,这个指令功能与seqz rd rs,即等于0置1一样。
  4. Andi rd, rs1, imm,表示寄存器内容与立即数做按位与操作,结果写入rd
  5. Ori rd, rs1, imm,表示寄存器内容与立即数做按位或操作,结果写入rd
  6. Xori rd, rs1, imm,表示寄存器内容与立即数做按位异或操作,结果写入rd,注意,xori rd, rs1, -1执行的是按位取反操作,功能与not rd, rs一样。

    移位一个常数位置,使用I指令,将rs1中的数进行移位
  7. Slli rd, rs1, imm表示shift left logical imm,将rs1中的数,逻辑左移imm这么多位数,逻辑移位的话都是填充0.
  8. Srli rd, rs1, imm表示shift right logical imm,表示逻辑右移,也是填充0
  9. Srai rd, rs1, imm表示shift right arithmetic imm,表示算数右移,即右移的时候,填充符号位。

U型指令

  1. Lui rd, imm表示load upper imm,用于构建32位立即数到rd中,低12位填充0,高20位是imm。注意,汇编的时候,imm的值只是立即数的高20位,低20位还要填充0.特别注意。
  2. Auipc rd, imm,add upper imm to pc,表示将立即数低12位填充0,构建32位偏移,然后加到这条auipc指令的pc上,然后写到rd里。注意auipc加上一条有12位立即数的jalr指令,可以跳到32位地址下的任意位置。

整数 寄存器-寄存器操作 R型 将rs1 rs2 做算数操作,然后写入rd

  1. Add rd, rs1, rs2 加法操作,忽略溢出
  2. slt rd, rs1, rs2 set less than rs1<rs2 就置1
  3. sltu rd, rs1, rs2 set less than 无符号比较
  4. and rd, rs1, rs2 按位与,逻辑与
  5. or rd, rs1, rs2 按位或,逻辑或
  6. xor rd, rs1, rs2 按位异或
  7. sll rd, rs1, rs2 shift left logical
  8. srl rd, rs1, rs2 shift right logical
  9. sub rd, rs1, rs2 减法
  10. sra rd, rs1, rs2 shift right arithmetic 算数右移,填充符号位。

NOP 指令

NOP指令使用addi x0 x0 0实现。


【2条】 控制转移指令,两种,一种无条件跳转,一种有条件分支,RV32I没有显式的分支延迟槽。如果跳转发生了缺页或者访问故障,那么就会报告异常。

  1. Jal rd, imm, jump and link, imm有20位,所以可以寻址正负1MB地址。Jal将jump指令(pc+4)之后的地址写入rd,一般软件调用使用x1作为返回地址寄存器,x5作为可选链接寄存器。如果rd是x0的话,就是一个普通的无条件跳转。
  2. 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

  1. Beq rs1, rs2, imm branch equal
  2. Bne rs1, rs2, imm branch not equal
  3. Blt rs1, rs2, imm branch less than, rs1 < rs2
  4. Blt rs1, rs2, imm branch less than
  5. Bge rs1, rs2, imm branch greater than rs1 >= rs2
  6. 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的值加载到内存。

  1. Lw rd, rs1 imm或者写作 lw rd imm(rs1) 加载一个32位的值到rd load word
  2. Lh rd rs1 imm 加载一个16位的值,然后符号扩展后到rd load half word
  3. Lhu rd rs1 imm加载16位,0扩展到32位到rd
  4. Lb rd rs1 imm 加载8位,符号扩展到rd load byte
  5. Lbu rd rs1 imm 加载8位,0扩展到rd
  6. Sw rs1, rs2 imm或者写作 sw rs2 imm(rs1) 加载寄存器的32位到内存 save word
  7. Sh rs1 rs2, imm 加载低16位到内存 save half word
  8. Sb rs1 rs2 imm 加载低8位到内存 save byte

存储顺序指令 fence 规定了一些读写输出输出顺序

  1. Fence
  2. Fence.I



环境调用和断点调试 ,使用I型

  1. Ecall rd rs1 给执行环境提供服务请求
  2. Ebreak rd rs1 返回控制调试环境

RV32I 基本指令集汇编解析相关推荐

  1. 【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )

    文章目录 一.创建 Capstone 反汇编解析器实例对象 二.设置 Cs 汇编解析器显示细节 一.创建 Capstone 反汇编解析器实例对象 使用 Capstone 反汇编框架 , 首先创建 Ca ...

  2. 29.字节码指令集与解析

    字节码指令集与解析 概述 java字节码对于虚拟机好像汇编语言对于计算机,属于基础执行指令 java虚拟机的指令由一个字节长度代表某种特定操作含义的数字(操作码Opcode)以及跟随其后的零至多个代表 ...

  3. arm汇编解析—tengine winograd_nhwc卷积实现

    与xnn/qnn卷积的异同点 tengine中实现了NHWC的winograd,目前nhwc的卷积主要以xnn/qnn框架为典型,所以这里拿tengine中的U*V和xnn/qnn卷积做个比较,简单总 ...

  4. arm汇编解析—qnnpack卷积实现

    目录 前言 基础直通车 arm基础知识 arm指令释义 qnn汇编代码解析 前言 最近在移植QNNPACK神经网络加速库,涉及到对卷积arm汇编的修改,这边做个记录,对汇编部分的内容进行注释,顺便学习 ...

  5. 10、字节码指令集与解析举例

    文章目录 第1章.概述 1.执行模型 2.字节码与数据类型 3.指令分析 第2章.加载与存储指令 1.复习:操作数栈与局部变量表 [1]操作数栈(Operand Stacks) [2]局部变量表(Lo ...

  6. 第十九篇_字节码指令集与解析

    文章目录 概述 执行模型 字节码与数据类型 指令分类 加载与存储指令 再谈操作数栈和局部变量表 局部变量压栈指令 常量入栈指令 出栈装入局部变量表 算术运算符指令以及举例 所有的运算符指令 比较指令的 ...

  7. Keil 汇编窗口无法设置断点,disassembly显示错误,Keil汇编解析错误

    今天遇到一次Keil的汇编窗口(disassembly窗口)无法添加断点的情况.如下图,在0x0808AF3A和0x0808AF3E的地方都可以添加断点,再往下0x0808AF3F的地方一直往后面就无 ...

  8. 汇编解析(6)-二进制文件(嵌入式,纯二进制格式的文件)进行反汇编和汇编

    二进制文件(嵌入式,纯二进制格式的文件) 除了nasm可以汇编,使用gas也可以的 (base) [myhaspl@localhost gasm]$ cat test3.asm .global _st ...

  9. 汇编解析(5)-intel的奔4的netburst控制单元技术提高指令处理速度

    1.Intel NetBurst微处理器体系结构是Intel Xeon处理器和Intel Pentium处理器的基础.它的新功能和创新,使得IA-32处理器得以保持高性能.处理器的构架指的是程序员可用 ...

最新文章

  1. Linux kernel block device 的 submit_bio 都做了什么?
  2. 什么是重载or重写,二者的区别是?
  3. Android基站定位
  4. 微软推出《我的世界》“编程一小时”免费教程,携手Code.org普及计算机科学教育
  5. 内核同步机制之Mutex Exclusion
  6. android主题切换框架,Android主题切换日夜间模式与换肤框架小结
  7. Redis集群搭建与简单使用
  8. matlab打包多个m文件,MATLAB GUI多个m文件和fig如何生成exe文件
  9. 【线性代数】P3 拉普拉斯定理
  10. 卷积码树状图怎么画_卷积码状态图怎么画 卷积编码器状态图画法
  11. 随机过程的均值函数、自相关函数、协方差函数
  12. 抖抖.....抖个不停的伺服电机——转动惯量匹配技术及资料分享
  13. selenium自动登录qq空间
  14. l2tp 账户管理系统
  15. 关于应用界面引导性的设计模式
  16. ADB命令获取手机应用安装包
  17. python金融趋势指标计算:布林带
  18. 【Python黑科技】tkinter库实战制作一个记事本(保姆级图文+实现代码)
  19. VC++ RLE压缩算法(附源码)
  20. 高性能MySQL读书摘要(五)创建高性能的索引

热门文章

  1. Pandas的panel结构
  2. 解决了.Net 2003“试图调试项目时发生错误”的问题
  3. 非空子集的生成(二进制法)
  4. Procmon 的使用
  5. VMware安装2003,win7,2008,kali
  6. 【Tools】P4V基础操作
  7. leetcode 最长单词
  8. 6.4.1 借贷账户信息
  9. PS 基础知识 CMYK全称是什么
  10. 从零开始做运营 入门版(张亮著)读书知识整理①