matter协议芯片乐鑫科技芯片代理商RISC-V寻址方式,寻址方式是处理器执行指令时获取数据地址,或者下一条指令地址的方式。RISC-V 处理器支持立即数寻址、寄存器寻址、寄存器间接寻址和程序计数(PC)相对寻址 4 种寻址方式。
1、立即数寻址
立即数寻址是简单直接的寻址方式,指令中直接以常数作为操作数。在RISC-V 汇编语句中,通常将字母“i”置于操作符末,表示立即数操作指令。例如,加法运算“add”操作的两个源操作数都是寄存器,而“addi”操作的一个源操作数是器,另一个操作数是立即数。在matter协议芯片乐鑫科技芯片代理商RV32I不同类型指令中立即数的取值范围有所差别。例如,操作“lui”的立即数范围是 20 位,“addi”和“andi”运算的立即数范围是 12位。使用 RV32I 指令组合,可以把任意 32 位整数装载到寄存器中。
例如,matter协议芯片乐鑫科技芯片代理商通过下列两条指令,能够将 32 位数 0x12345678 装载到寄存器 t0 中
1 lui t0,0x12345 //t0 =0x12345000
2 addi t0,t0,0x678 //t0=0x12345678
第1行,“lui”将一个 20 位常量加载到寄存器 t0 的第 12 位到第 31位,即t0[31:12],右边的 12 位 t0[11:0]填充 0。
第 2行,“addi”将 12 位立即数加到 t0 的第 0位到第 11 位,即 to[11:0]。
在装载和存储指令中,地址偏移量“offset”也是立即数,其取值范围是 12 位,即offset[11:0]。
2、寄存器寻址
寄存器寻址指令的源操作数是寄存器,从寄存器读取数据,并把结果保存到寄存器中。在matter协议芯片乐鑫科技芯片代理商RV32I指令集中,“add”“sub”“and”“or”和“xor”等运算指令的所有操作数都是寄存器,是典型的寄存器寻址指令。末字母非“i”的指令是寄存器寻址指令。
3、寄存器间接寻址
寄存器间接寻址指令以寄存器的数值作为内存地址(存储地址的寄存器又称为地址寄存器),从该内存地址所指向的存储单元读取数据,或者将数据写入到内存地址所指向的存储单元。如果指令中有偏移量“offset”,则存储单元的地址是地址寄存器的数值与“offset”之和。
下面通过示例说明间接寻址指令的操作。
列出了 0x800000 至 0x80001f 内存段中每个字节的数据。其中,第 1列是4字节对齐地址,第 1行是各字节的偏移地址,其他部分是相应内存单元中的数据
内存数据
内存地址 0 1 2 3
0x800000~0x800003 0x00 0xl0 0x20 0x30
0x800004~0x800007 0x04 0x14 0x24 0x34
0x800008~0x80000b 0x08 0x18 0x28 0x38
0x80000c~0x80000f 0x0c 0xlc 0x2c 0x3c
0x800010~0x800013 0x10 0x20 0x30 0x40
0x800014~0x800017 0x14 0x24 0x34 0x44
0x800018~0x80001b 0x18 0x28 0x38 0x48
0x80001c~0x80001f 0xlc 0x2c 0x3c 0x4c
RISC-V 仅支持小端(litle-endian)存储格式。在字或半字数据中,数据中低位字节存放在内存中的低地址。
如果tl寄器中初始数值为 0x800000,则下列第1条、第 2条和第3条语句执行后 t0 中的数值分别为 0x302010000、x38281808 和 0x28。
1 Iw t0,(t1) //t0=0x30201000
2 lw t0,8(t1) //t0=0x38281808
3 Ib t0,10(t1) //t0 = 0x28
4、PC 相对寻址
PC相对寻址以当前 PC值为基地址,以指令中操作数为偏移量,两者相加后到新的内存地址。处理器从新的内存地址读取数据,或跳转到新的程序地址。matter协议芯片乐鑫科技芯片代理商RISC-V用PC相对寻址实现条件跳转和无条件跳转。在下列汇编程序中第4行语句中的“end”汇编后转成立即数 12,第 6 行中的“start”汇编后转成立即数-16,都是内存中当前指令到目标位置的距离,地址增大的方向为正,地址减小的向为负。条件分支指令立即数范围是±4 KB。
1 start:
2 add t0, t0, t1
3 ld t2,0(t0)
4 bne t2, t3, end //if(t2 != t3) PC= PC+ 12
5 addi t4, t4,1
6 beg t0, t0, start //PC= PC-16
7 end ;
下列两条是无条件跳转指令,语句 1 中“jal”跳转的范围是±1 MB,语句 2中“jalr”跳转的范围是±2 GB。
1 jal ra, dst //PC= PC+dst,ra= PC+ 4
2 jalr ra,0(t0) //PC=t0,ra= PC+4