RSIC-V指令集格式
由于在早期电脑虽然算力很强(针对于当时的其他算力工具),但是由于指令不同,所需要的电路结构不同,所以在使用时,都需要重新铺线,但是计算机的体积有特别大,所以又将算力提升节约下来的时间给浪费掉。有人提出不仅将数据存储在存储器中,同时也把指令也保存在存储器里。在RISC-V里面一条指令是32 位,但是每条指令里面既有操作也有寄存器的名字,这些东西又是如何保存的,这就涉及到指令集的格式。
在risc_v里有六种指令集,分别是寄存器和寄存器的R型指令,寄存器和立即数的I型指令,用于储存的S型指令,用于分支转移的B型指令,以及高20比特位的立即数的U型指令,用于跳转的J型指令。
R型指令
funct7,funct3是功能码
rs2和rs1是原寄存器里面是寄存器的编号,rd是目的寄存器。opcode是操作码,0110011是所有R型指令的操作码,功能码和操作码组合使用,操作码的下面用功能来细化功能。
功能码细化。
I型指令
由于立即数的数值范围超过0~31并且和R型相同的是有一个原寄存器和一个目的寄存器。所以在R型的基础上进行改变。
I型装载指令
转载的操作码是0000011,源寄存器里面是原地址寄存器的编号,目的寄存器里是目的寄存器的编号,前面是偏移量。
LH,装载半字的指令。从存储器读取的数据经符号扩展为32为存到目的寄存器里。
lbu,里的u是无符号数,装载无符号数。lhu是从寄存器读取16位经过0扩展为32位存到目的寄存器中。
S型
把数据从寄存器保存到存储器里,所以要有一个寄存器,一个保存存储器地址的部分为了和R型指令一样,将高7位和原寄存器的位置用来保存偏移量。
B型
由于代码有限,所以在以pc寄存器的附近会找到分支的地址,由于用字节来偏移浪费资源,所以使用字,但是在RISC-V中,存在这16位的可变寻址,所以用2字节来表示,用I型的立即数来表示偏移量,所以有2^12个以2为增量的偏移量。相当于13位
偏移量的计算,看第一条指令与分支之间的指令数,一个是32位,本题是4条(没写出来,是4条)4*32=8*2=16比特,16是13位的表述,13位里最后一位永远是0,故舍去。
U型指令
使用LUI可以写入高20位的数据,同时将低12位清零。使用ADDI指令可以写入低12位的数据。
J型指令
jal将PC值加4,然后保存在rd,保存的是返回地址
j指令是jal的伪指令,比如
j指令目的寄存器时x0,从而忽略对返回地址的保存。
这才是正确用法,把PC+4保存在ra,跳转到funcname.
jalr指令是i型指令。将PC+4保存在目的寄存器,将源寄存器加偏移量实现跳转。这个偏移量不是32字节单位。