-
Notifications
You must be signed in to change notification settings - Fork 1
10月10日笔记
2.2 访存指令
计算机系统中不同格式的数据有的会低于32位,但很少有低于8位,因此以8位作为单位数据,以8位的倍数来存储数据
8位数据量常常被称为1个字节,一个32位的字是由4字节组成的
在RISC-V的存储系统中,是以字节为单位来寻址的,每一个字地址可以拆分到4个字节地址,在小端系统中某个字的地址与它的最低字节地址是相同的
最低位字节位于最右侧的最低地址,此时每个字的地址与它的最低位字节地址是相同的
大端和小端(Big Endian vs. Little Endian)是指字节在存储器中存储顺序的两种方式
大端是将一个字数据的最低位字节存储在最高字节地址上
小端是将一个字数据的最低位字节存储在最低字节地址上
寄存器与存储器的差异:32个32位的寄存器只有128个字节的容量;DRAM存储器的容量至少数GB;寄存器的访问速度是DRAM的100倍到500倍
RISC-V中load word使用指令lw,存储store word使用指令sw
读字节数据和写字节数据的访存传输指令lb和sb,指令格式与lw和sw相同,但只针对1字节的源数据进行操作
符号扩展,将字节的最高bit位填充到所有高bit位实现符号扩展
RISC-V提供了无符号字节状态指令,unsigned byte 装载指令lbu,采用全0填充的方式
RISC-V中是不存在无符号字节保存指令sbu,保存字节时只会保存覆盖对应存储地址的字节数据,不会进行扩展
2.3 条件判断分支转移指令
RISC-V指令系统中,有一类用于条件判断分支转移的指令能实现与高级语言中if语句相类似的效果
beq stands for banch if equal
bne for if not equal
条件判断分支转移指令:条件分支转移;无条件分支转移
条件分支转移指令:通过比较判断操作数值,决定是否改变程序流向,如beq指令、bne指令、blt指令(比较小于)、bge指令(比较大于等于)
无条件分支跳转指令:可以直接进行跳转而不需要附加条件判断,如jump(j)指令可以直接跳转到label标识的指令目标地址
bltu指令会将两个操作数当做无符号数进行比较
2.4 逻辑运算指令
RISC-V逻辑运算指令用于对一个字数据中的比特位进行操作
C Java RISC-V
logical operations operators operators operators
Bit-by-bit AND & & and
Bit-by-bit OR | | or
Bit-by-bit XOR ^ ^ xor
Shift left logical << << sll
Shift right logical >> >> srl
在RISC-V指令集中没有专门的逻辑非指令,使用逻辑异或指令xor与0x1111 1111按位异或即可得到逻辑非的结果
算数右移指令:shift right arithmetic (sra)srai 当对操作数执行算术右移n位后空出的高位由原数最高比特位的符号扩展得到
如果算数右移n位后,得到的结果不等同于原数被2的n次方相除
2.5 函数调用
RISC-V程序段与函数调用的实现方法
a0~a7对应x10~x17的寄存器,常用于传递参数,x0寄存器为0,0值寄存器
伪指令
每条指令都是以32位的机器码形式存放于存储器中
一般情况下,指令是顺序执行的,更新的PC值是原值+4,但在遇到转移分支指令时,需要根据转移情况更新为跳转位置的地址值
函数调用的6个步骤
1、发生函数调用时,在执行函数功能前,先将这次调用中需要用到的参数保存,方便取用
2、将控制权移交给这次调用的功能函数
3、根据情况为函数申请一定的本地存储空间,以满足函数执行过程中需要的存储需求
4、执行该函数的功能操作
5、在函数执行完成后,将得到的结果数据存放好,便于主进程来获取,同时还原函数执行过程中使用到的寄存器值、释放分配给函数的本地存储空间
6、将控制权返还给原进程
RISC-V Function Call Conventions
1、a0~a7:编号x10~x17的寄存器,用来向调用的函数传递参数,a0和a1寄存器常用于传递返回值
2、ra,即x1寄存器,用来保存返回时的返回地址值
3、s0~s11,对应编号x8~x9和x18~x27的寄存器用来作为保存寄存器,保存原进程中的关键数据避免在函数调用过程中被破坏
RISC-V中,所有指令都是4字节的
函数调用可能发生在程序段的多个位置,每次函数调用时返回地址都会随发生调用时地址的不同而不同
需要在函数调用前记录下返回地址保存在ra寄存器中,返回时再利用jr指令返回到ra寄存器中保存的地址值,保证多次调用的灵活性
jal jump and link 跳转并链接
通过jal指令,可以形成指向调用点的地址或链接,从而使函数能返回正确的地址
跳转则会使PC跳转指向被调用函数的地址,并且将链接得到的下一指令的地址作为返回地址,保存在ra寄存器中
jr指令 能跳转到寄存器值所对应的地址空间,我们使用这条指令跳转到ra寄存器保存的地址值以实现函数的返回,在汇编用法中,有用ret指令来指代jr ra的操作