[笔记二] 学习开发一个RISC-V上的操作系统
资料来源
RISC-V 汇编语言
- 汇编语言(Assembly Language)是一种"低级"语言
- 汇编语言的缺点:难读、难写、难移植
- 汇编语言的优点:灵活、强大
- 汇编语言的应用场景
- 需要直接访问底层硬件的地方
- 需要对性能执行极致优化的地方
汇编语言语法介绍(GNU版本)
- 一个完整的 RISC-V 汇编程序有多条语句(statement)组成
- 一条典型的 RISC-V 汇编语句由 3 部分组成:
- [label:] [operation] [comment]
- label(标号):GNU汇编中,任何以冒号结尾的标识符都被认为是一个标号
- operation可以有以下多种类型:
- instruction(指令):直接对应二进制机器指令的字符串
- pseudo-instruction(伪指令):为了提高编写代码的效率,可以用一条伪指令指示汇编器产生多条实际的指令
- directive(指示/伪操作):.通过类似指令的形式(以"."开头),通知汇编器如何控制代码的产生等,不对应具体的指令
- macro:采用.macro/.endn自定义宏
- comment(注释):常用形式,"#"开始到当前行结束
RISC-V 汇编指令操作对象
- 寄存器
- 32个通用寄存器,x0~x31(RV32I的通用寄存器组)
- 在RISC-V中,Hart在执行算数逻辑运算时所操作的数据必须直接来自寄存器
- 内存
- Hart可以执行在寄存器和内存之间的数据读写操作
- 读写操作使用字节(Byte)为基本单位进行寻址
- RV32可以访问最多2^32个字节的内存空间
- x0比较特殊,只读,返回永远是0,写没有任何意义
RISC-V 汇编指令总览
RISC-V 汇编指令编码格式
- 指令长度:ILEN1 = 32 bits(RV32I)
- 指令对齐:IALIGN = 32 bits(RV32I)
- 32个bit划分成不同的"域(field)"
- funct3/funct7和opcode一起决定最终的指令类型
- 没必要去记每条指令,只要知道在哪查即可
- 指令在内存中按照小端序排列
- 主机字节序(HBO - Host Byte Order)
- 一个多字节整数 在计算机内存中存储的字节顺序称主机字节序或本地字节序
- 不同类型CPU的HBO不同,这与CPU的设计有关,分为大端序(Big-Endian)和小端序(Little-Endian)
- 大端(Big-Endian):数据的高位字节存放在内存的低地址
- 小端(Little-Endian):数据的低位字节存放在内存的低地址
- 6种指令格式:
- R-type:(Register),有三个fields,用于指定3个寄存器参数
- I-type:(Immediate),两个寄存器参数外+一个立即数参数(宽度为12bits)
- S-type:(Store),两个寄存器参数+一个立即数参数(宽度为12bits,但fields的组织形式不同于I-type)
- B-type:(Branch),除了带有两个寄存器参数外,还有一个立即数参数(宽度为12bits,但取值为2的倍数)
- U-type:(Upper),一个寄存器参数+一个立即数参数(宽度为 20bits,用于表示一个立即数的高20位)
- J-type:(Jump),一个寄存器参数+一个立即数参数(宽度为20bits)
RISC-V 汇编指令详解
算术运算指令(Arithmetic Instructions)
- add、sub、addi(ADD immediate)、LUI(Load Upper Immediate)
指令 语法 描述 eg ADD ADD RD, RS1, RS2 RS1和RS2的值相加,结果保存到RD add x5, x6, x7 SUB SUB RD, RS1, RS2 RS1的值减去RS2的值,结果保存到RD sub x5, x6, x7 ADDI ADDI RD, RS1, IMM RS1的值和IMM相加,结果保存到RD addi x5, x6, 100 LUI LUI RD, IMM 构造一个32位的数,高20位存放IMM,低12位清零。结果保存到RD lui x5, 0x12345 AUIPC AUIPC RD, IMM 构造一个32位的数,高20位存放IMM,低12位清零。结果和PC 相加后保存到RD auipc x5, 0x12345
- 有符号数在计算机中的表示:二进制补码(two’s complement),eg&#