最近在学risc-v指令集,写一些基本的指令和原理帮助自己的理解,方便后面复习。(只是我的个人理解,可能有误大家注意分辨,也欢迎大家批评指正)ps:通过ripes仿真调试
定义寄存器及数据
lui指令是为了扩展位数,方便观察后面按字节,按半字,按字加在数据
lui t0,0x12345
addi t0,t0,0x678
lui t1,0x11111
addi t1,t1,0x111
lui t2,0x23456
addi t2,t2,0x789
lui t3,0x34567
addi t3,t3,0x777
store指令
将寄存器中的数据存储到 data memory
注意:
- store指令的方向是寄存器t0~t3 存储到memory中 x0,x0+4, x0+8, x0+12四个位置中。即代码中的位置是从从左往右store(Load相反)
- 为啥是memory中的x0,x0+4, x0+8…呢?因为sw是按字存储,按字节编址的话,一个字占四个字节,所以第一个字是 x0 到 x0+3 ,那么第二个字的位置则是 x0+4 到 x0+7,以此类推。
- 还有sb,sh,用法和Load相通,详细可见load指令中的介绍
sw t0,0,x0
sw t1,4,x0
sw t2,8,x0
sw t3,12,x0
Load指令
从 memory 中加载数据到寄存器
- load指令的方向是将memory中 x0,x0+4, x0+8…的几个位置中,加载到寄存器t2,t3,t4等上面。即代码中的位置是从从右往左load
按字加载
lw t2,0,x0
lw t3,4,x0
按半字(2Byte)
lh t4,8,x0
lh t5,10,x0
按Byte
lb t6,11,x0
lb s1,12,x0
lb s3,13,x0
lb s4,14,x0
注意:
- lw:按字Load,所以Load两个字需要访问 memory 的两个字,memory中的两个字存储方式如下图。因此寄存器t2, t3中的就是从memory中加载的l两个字
- lh:所以Load一个字需要访问 memory 的一个字,memory中的一个字存储方式如下图。因此寄存器t2, t3中的就是从memory中加载的一个字
3、 lb:所以Load一个字需要访问 memory 的一个字,memory中的一个字存储方式如下图。因此寄存器t6,s1,s2,s3中的就是从memory中加载的一个字
原理和上面差不多,只不过是按照字节Load一个字,就需要四次lb才能把一个字Load出来。