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