Risc-V学习日记05
Day11
//4-1到4-3的作业以我目前的能力没法解读
[label:][operation][comment]
[label:]{必须有:}
{
_start: # Label
li x6, 5 # pseudo-instruction[6,7相当于同一行]
li x7, 4 # pseudo-instruction
add x5, x6, x7 # instruction
do_nothing # Calling macro
stop: j stop # statement in one line
.end # End of file
}
编译完后变成机器指令
operation 可以有以下多种类型:
{
instruction(指令): 直接对应二进制机器指令的字符串
pseudo-instruction(伪指令): 为了提高编写代码的效率,可以用一条伪指令指示汇编器产生多条实际的指令(instructions)。
有点类似一个function定义一个函数?
directive(指示/伪操作): , 通过类似指令的形式(以"."开头),通知汇编器如何控制代码的产生等,不对应具体的指令。
{
.macro do_nothing # directive
nop # pseudo-instruction
nop # pseudo-instruction
.endm # directive
.text # directive
.global _start # directive
}
macro:采用 .macro/.endm 自定义的宏
{
.macro do_nothing # directive
nop # pseudo-instruction
nop # pseudo-instruction
}
}
RISC-V 汇编指令操作对象
寄存器:
32个通用寄存器,x0 ~ x31[RV32I]
x0,zero特殊寄存器不能写读出来永远为0
pc寄存器无法访问,用于保存当前执行指令的位置(指令指针)
在 RISC-V 中,Hart 在执行算术逻辑运算时所操作的数据必须直接来自寄存器
内存:
Hart 可以执行在寄存器和内存之间的数据读写操作;
读写操作使用字节(Byte)为基本单位进行寻址;
每个字节对应一个地址
RV32 可以访问最多 2^32 个字节的内存空间。
RISC-V 汇编指令编码格式
指令长度:ILEN1= 32 bits (RV32I) #32bit=4byte(字节)
指令对齐:IALIGN = 32 bits (RV32I)
32 个 bit 划分成不同的 "域(field)"
funct3/funct7 和 opcode 一起决定最终的指令类型
opcode域
inst[1:0]=11#第一位和第零位一定是11
//突然豁然开朗
参考riscv-spec-20191213.pdf
ADD:0110011,因为inst[1:0]=11,所以不看最后两位
查表Chapter 24,page129
inst[6:5]
01
inst[4:2]
100
OP:operation
指令在内存中按照"小端序"排列
小端序的概念:
主机字节序 (HBO - Host Byte Order)
字节序:单字节整数[一个字符8bit,是整数,没有排序问题]
一个 多字节整数 在计算机内存中存储的字节顺序称为主机字节序(HBO- Host Byte Order,或者叫本地字节序);
{
short,int,long多字节
}
不同类型 CPU 的 HBO 不同,这与 CPU 的设计有关。分为 大端序(Big-Endian) 和 小端序(Little-Endian)
{
一定要确认内存读取顺序:大小端序
例子:
[十进制]287454020(贰亿捌仟柒佰肆拾伍万肆仟零贰拾){高位:贰亿,低位:贰拾}
[二进制] 00010001 00100010 00110011 01000100 {高位:00010001,低位:01000100}
[十六进制] 11 22 33 44 {高位:11,低位:44}
内存:
A+3 0x00
A+2 0x00
A+1 0x00
A 0x00
大端序:高位低地址
A+3 0x44
A+2 0x33
A+1 0x22
A 0x11
小端序:低位低地址
A+3 0x11
A+2 0x22
A+1 0x33
A 0x44
}
大端序(Big-Endian)
大端(Big- Endian):数据的高位字节存放在内存的低地址
小端序(Little-Endian)
小端(itle-Endian):数据的低位字节存放在内存的低地址
"R-type":(Register),每条指令中有三个 fields,用于指定 3 个 寄存器参数
rs2,rs1,rd[用于存放寄存器参数]
rd(register destination)存放结果
rs(register source)源数据
一个寄存器占5个bit
"I-type": (Immediate),每条指令除了带有两个寄存器参数外,还带有一个立即数参数(宽度为 12 bits)。
S-type: (Store),每条指令除了带有两个寄存器参数外,还带有一个立即数参数(宽度为 12 bits,但 fields 的组织方式不同于 I-type)
B-type: (Branch),每条指令除了带有两个寄存器参数外,还带有一个立即数参数(宽度为 12 bits,但取值为 2 的倍数)。
U-type: (Upper),每条指令含有一个寄存器参数再加上一个立即数参数(宽度为 20bits,用于表示一个立即数的高 20 位)
J-type: (Jump),每条指令含有一个寄存器参数再加上一个立即数参数(宽度为 20bits)
Risc-V学习日记05
于 2023-08-02 17:05:29 首次发布