32位常数,“双指令序列”法 ·计算:大立即数,$2.10.1 -取20位立即数:取左移12位后的20位立即数 lui:load upper immediate,U-type -加载20位立即数到[31:12],[11:0]=0 -例:luix5,0x12345;x5=0x12345000, -+低12位 ·addi:-type 。 长跳转:寻址32位地址空间,$2.10.2 -lui:取高20位—$2.18的auipc? ·例:luix5,0x12345; jalr:jump link reg,l-type ·高20位+低12位,一基于x5间接跳转,不是PC相对寻址 ·例:jalr x1,100(x5);x1=PC+4,goto x5+100 U-type immediate[31:12] rd opcode l-type immediate[11:0] rs1 funct3 rd opcode
32位常数,“双指令序列”法 • 计算:大立即数,$2.10.1 – 取20位立即数:取左移12位后的20位立即数 • lui:load upper immediate,U-type – 加载20位立即数到[31:12],[11:0]=0 – 例:lui x5,0x12345;x5=0x1234 5000, – +低12位 • addi:I-type • 长跳转:寻址32位地址空间,$2.10.2 – lui:取高20位——$2.18的auipc? • 例: lui x5,0x12345; – jalr:jump & link reg,I-type • 高20位+低12位,——基于x5间接跳转,不是PC相对寻址! • 例:jalr x1,100(x5);x1=PC+4,goto x5+100
转移指令的寻址方式$2.7,2.10.2,2.8 ·两类转移 -分支指令:if,for,while,case,goto 。 条件分支:beq rs1,rs2,L1;PC相对,12位offset 。 无条件分支:可多种方式 -jalx0,Label;:J-type,PC相对,20位offset -jalr x0,100(x5);-type,间接转移,12位offset -beq x0,xO,Loop;B-type -过程调用:x1为返回地址ra Calling:jal x1,ProcedureAddress;NPC=>ra, Return:jalr x0,0(x1);“间接跳转”,基于x1而非PC 。转移范围:near(12位,20位),far(32位) -远程转移:32位(ui高20位,jalr低12位) imm 12 imm 10:5 rs2 rsl funct3 imm 4:1 imm 11 opcode B-type imm 20 imm 10:1 imm 11 imm 19:12 rd opcode J-type imm 11:0 rsl funct3 rd opcode I-type
转移指令的寻址方式$2.7,2.10.2,2.8 • 两类转移 – 分支指令:if,for,while,case,goto • 条件分支:beq rs1,rs2,L1;PC相对,12位offset • 无条件分支:可多种方式 – jal x0,Label;J-type,PC相对,20位offset – jalr x0,100(x5);I-type,间接转移,12位offset – beq x0,x0,Loop;B-type – 过程调用:x1为返回地址ra • Calling:jal x1, ProcedureAddress;NPC=>ra,转 • Return:jalr x0, 0(x1);“间接跳转”,基于x1而非PC • 转移范围:near(12位,20位),far(32位) – 远程转移:32位(lui高20位,jalr低12位)
其他RV指令(了解),$2.18,$5.14 Instruction Name Format Descriptlon ·图2-37 Add upper immediate to PC auipc U Add 20-bit upper immediate to PC;write sum to register Set if less than slt R Compare registers;write Boolean result to register -14条 Set if less than,unsigned sltu R Compare registers;write Boolean result to register Set if less than,immediate slti Compare registers;write Boolean result to register Set if less than immediate,unsigned sltiu Compare registers;write Boolean result to register Add word addw R Add 32-bit numbers Subtract word subw R Subtract 32-bit numbers Add word immediate addiw Add constant to 32-bit number Shift left logical word sl1w R Shift 32-bit number left by register Shift right logical word srlw R Shift 32-bit number right by register Shift right arithmetic word sraw R Shift 32-bit number right arithmetically by register Shift left logical word immedate slliw Shift 32-bit number left by immediate Shift right logical word immediate srliw Shift 32-bit number right by immediate Shift right arithmetic word immediate sraiw Shift 32-bit number right arithmetically by immediate ·lui,auipc Type Mnemonic Name FENCE.I Instruction Fence lr.d,sc.d;$2.11 Mem.Ordering FENCE Fence SFENCE.VMA Address Translation Fence CSRRWI CSR Read/Write Immediate CSRRSI CSR Read/Set Immediate 图5-47,系统指令,13条 CSR Access CSRRCI CSR Read/Clear Immediate CSRRW CSR Read/Write -同步,CSR访问,系统调用 CSRRS CSR Read/Set CSRRC CSR Read/Clear -CSR:控制和状态寄存器 ECALL Environment Call EBREAK Environment Breakpoint System SRET Supervisor Exception Return WFI Wait for Interrupt
其他RV指令(了解),$2.18,$5.14 • 图2-37 – 14条 • lui,auipc • lr.d,sc.d;$2.11 • 图5-47,系统指令,13条 – 同步,CSR访问,系统调用 – CSR:控制和状态寄存器
示例:COD4图B.1.5 #include <stdio.h> int main (int argc,char *argv[]) { int i; int sum 0; for (i=0;i <100;ii 1)sumsum ii; printf(“The sum from0..l00is%d\n”,sum); }
示例:COD4图B.1.5
SP-0000 003f ffff fffOnex Stack 示例:COD4图B.1.4 ↑ text Dynamic data .align 2 .globl main Static data main: 0000000010000000hex subu $sp, $sp,32 Text SW sra, 20($sp) PC→0000000000400000ne× sd $a0,32($sp) Reserved SW $0, 24($sp) 0 SW $0, 28($sp) 100p: Name (ABI name) 1w $t6,28($sP) Reg#. Usage mu] $t7,$t6, $t6 xO (zero) 0 The constant value 0. 1w $t8,24($sP) addu $t9, $t8,$t7 x1 (ra). 1 Return address(link register). SW $t9, 24($sP) addu $t0, $t6,1 x2(sp) 2o Stack pointer. SW $t0,28($sp) ble $t0,100,100p x3(gp) 3 Global pointer. 1a $a0,str 4 Thread pointer. 1w $a1,24($sp) x4(tp) jal printf x5-x7(t0-t2)e 5-7e Temporaries move $v0,$0 1w sra, 20($sp) x8-x9(fp/s0-s1) 8-9e Frame pointer,Saved register. addu $sp,$sp,32 jr $ra x10-x17(a0-a7) 10-17 Arguments(a2-a7)/results(a0,a1). x18-x27(s2-s11) 18-27 Saved register. .data x28-X31(3-t6)¥ 28-31 Temporaries. .align 0 str: asciiz "The sum from 0 .100 is %d\n
示例:COD4图B.1.4