大三老菜狗来更新啦,哎,感叹一下生活不易,天天犯困。
RISC-V汇编学习笔记系列是RISC-V学习笔记系列下的一个分支,在这里着重讲解的是RISC-V的汇编指令是如何实现的。对读懂RISC-V有一定的帮助,但因为不是主线剧情所以会更加随意一点。
1.位(Bit):计算机系统中不同格式的数据有的会低于32位,但很有低于8位的,我们以8位作为单位数据,以8位的倍数来存储数据。[上一章我们就说到我们使用的开源项目是RV32的(及32位的)]
2.字节(Byte):8位的数据量为一个字节,一个32位的字就是由4字节组成的。
3.在RISC-V的存储系统中,以字节为单位来寻址。每一个字地址可拆分到4个字节地址,在小端系统中某个字的地址与它的最低位字节地址是相同的。
1.大端与小端是字节在存储器中存储顺序的两种方式
2.大端是将一个字数据的最低位字节存储在最高字节地址上(中国采用大端)
3.小端是将一个字数据的最低位字节存储在最低字节地址上
BYTE3 BYTE2 BYTE1 BYTE0
00000000 00000000 00000100 00000001
大端 | 小端
ADDR3 ADDR2 ADDR1 ADDR0 | ADDR3 ADDR2 ADDR1 ADDR0
BYTE0 BYTE1 BYTE2 BYTE3 BYTE3 BYTE2 BYTE1 BYTE0
1.32个32位的寄存器组只有128个字节的容量
2.DRAM存储器的容量很多都是GB的(现在应该没有MB的了吧,我们通常称为内存)
3.寄存器的访问速度是DRAM的数百倍
RISC-V使用lw指令(Load Word)将数据存储器装载到寄存器中
in C in RISC-V
int A[100]; <——> lw x10, 12(x15) # Reg x10 get A[3],x10 = A[3]
g = h + A[3]; add x11, x12, x10 # g = h + A[3]
注释:x15 - 基址寄存器(指向A[0]);12 - 12bytes也就是3字节偏移量,一个字节偏移量为4bytes
RISC-V使用sw指令(Store Word)将寄存器的内容存到存储器中
in C in RISC-V
int A[100]; <——> lw x10, 12(x15) # Reg x10 get A[3],x10 = A[3]
A[10] = h + A[3]; add x10, x12, x10 # Reg x10 get h + A[3],x10 = h + A[3]
sw x10, 40(x15) # A[10] = h + A[3]
注释:x15 - 基址寄存器(存放A[0]);12,40 - 提供的bytes数;字节数据的地址值需要是4的倍数
RISC-V提供字节数据的访存指令
传输指令lb(load byte)和sb(store byte),他们的指令格式与lw和sw一样,但只针对1字节的源数据进行操作。
1.sb:将寄存器中最低字节位的1字节数据保存到对应字节地址中。
2.lb:将字节地址中的1字节数据符号扩展后装载到对应的寄存器中。
lb x10, 3(x11) # 将寄存器x11的内容+3得到一个地址,读取该地址中得内容,存到x10寄存 器当中
3.lbu:对比lb是采用全零地址进行扩展
4.RISC-V不存在无符号保存指令sbu保存字节时只会覆盖对应存储地址得字节数据不会进行位扩展(这玩意是有点抽象的)