Format Instruction Opcode Funct3 Funct6/7 add 0110011 000 0000000 RV整数指令操作码 sub 0110011 000 0100000 s11 0110011 001 0000000 xor 0110011 100 0000000 srl 0110011 101 0000000 。 常用37条,图2-18 R-type sra 0110011 101 0000000 or 0110011 110 0000000 一按字长分类:访存指令 and 0110011 111 0000000 Ir.d 0110011 011 0001000 ·b,h,w,d sc.d 0110011 011 0001100 1b 0000011 000 n.a. 一按数据类型分类 Ih 0000011 001 n.a. lw 0000011 010 n.a. ·i,u ld 0000011 011 n.a. lbu 0000011 100 n.a. 一按指令格式分类 Ihu 0000011 101 n.a. I-type 1wu 0000011 110 n.a. 典型:按功能分类 addi 0010011 000 n.a. s111 0010011 001 000000 -同功能:op同,funct不同 xori 0010011 100 n.a. srli 0010011 101 000000 srai 0010011 101 010000 -ALU,访存,分支 ori 0010011 110 n.a. andi 0010011 111 n.a. ·add:R-type jalr 1100111 000 n.a. ·addi:l-type sb 0100011 000 n.a. sh 0100011 001 n.a. S-type ·w:load,-type SW 0100011 010 n.a. sd 0100011 111 n.a. ·sw:store,S-type beg 1100111 000 n.a. bne 1100111 001 n.a. ·beq:SB-type SB-type blt 1100111 100 n.a. bge 1100111 101 n.a. jal (J-type),jalr (I-type) bltu 1100111 110 n.a. bgeu 1100111 ·51条指令示例:图3-12 111 n.a. U-type lui 0110111 n.a. n.a. UJ-type e1 1101111 n.a. n.a
RV整数指令操作码 • 常用37条,图2-18 – 按字长分类:访存指令 • b,h,w,d – 按数据类型分类 • i,u – 按指令格式分类 • 典型:按功能分类 – 同功能:op同,funct不同 – ALU,访存,分支 • add:R-type • addi:I-type • lw:load,I-type • sw:store,S-type • beq:SB-type • jal(J-type),jalr(I-type) • 51条指令示例:图3-12
RV16/RV32/RV64的操作码域:7位 XXXXXXXXXXXXXX88 16-bit(aa≠11》 XXXXXXXXXXXXXXXX xxxxxxxxxxxbbb11 32-bit(bbb≠111) ··XXX XXXXXXXXXXXXXXXX xxxxxxxxxxx11111 >32-bit Byte Address: base+4 base-+2 base Can support variable-length instructions. Base instruction set(RV32)always has fixed 32-bit instructions lowest two bits 112 All branches and jumps have targets at 16-bit granularity (even in base ISA where all instructions are fixed 32 bits)
RV16/RV32/RV64的操作码域:7位 • Can support variable-length instructions. • Base instruction set (RV32) always has fixed 32-bit instructions lowest two bits = 112 • All branches and jumps have targets at 16-bit granularity (even in base ISA where all instructions are fixed 32 bits)
RV示例:指令格式,寻址方式,图2-6 R-type Instructions funct7 rs2 rs1 funct3 rd opcode Example add (add) 0000000 00011 00010 000 00001 0110011 add x1,x2,x3 sub (sub) 0100000 00011 00010 000 00001 0110011 sub x1,x2,x3 I-type Instructions immediate rs1 funct3 rd opcode Example addi (add immediate) 001111101000 00010 000 00001 0010011 addi x1,x2,1000 1d (load doubleword) 001111101000 00010 011 00001 0000011 1dx1,1000(x2) S-type Instructions immed rs2 rs1 funct3 immed opcode Example -iate -iate sd (store doubleword) 0011111 00001 00010 011 01000 0100011 sdX1,1000(x2) 汇编指令寻址方式表示 -寄存器寻址【名】,立即数寻址【二/十/16进制】,基址寻址【1000(x2)】 -算逻指令均为寄存器寻址,load/store为基址寻址 机器指令与汇编指令中源操作数和目的操作数的位置对应关系 -汇编指令:x2x3为源操作数rs1/rs2,x1为目的操作数rd 注意S-type:x1=rs2(源),x2=rs1(基址),rs2=>mem[rs1+1000]
• 汇编指令寻址方式表示 – 寄存器寻址【名】,立即数寻址【二/十/16进制】,基址寻址【1000(x2)】 – 算逻指令均为寄存器寻址,load/store为基址寻址 • 机器指令与汇编指令中源操作数和目的操作数的位置对应关系 – 汇编指令:x2/x3为源操作数rs1/rs2,x1为目的操作数rd – 注意S-type:x1=rs2(源),x2=rs1(基址),rs2 => mem[rs1+1000] RV示例:指令格式,寻址方式,图2-6
$zero:0寄存器,$2.3.2 Name Register Usage Preserved numbor on call? 0 The constant value 0 n.a. x1(ra》 1 Retum address (link register) yes ·x0固定为“0” x2《5p) Stack pointer yes x3 (gp) 3 Global pointer yes x4 (tp) 4 Thread pointer yes x5×7 5-7 Temporaries no x8-x9 8-9 Saved yes 。data move:reg-reg x10-x17 10-17 Arguments/results no x18-x27 18-27 Saved yes x2B-x31 28-31 Temporaries no add $v0,$s0,$zero returns f ($v0 $s0 0) ·寄存器赋值 addi $v0,$zero,1非return1 。Compare slti $t0,$a0,1 #test for n 1 beq $t0,$zero,Ll 非ifn>=1,g0t0L1 ·Goto:beqx0,x0,Exit
$zero:x0寄存器,$2.3.2 • x0固定为“0” • data move:reg-reg • 寄存器赋值 • Compare • Goto:beq x0,x0,Exit
位扩展:短立即数=>32位立即数,$2.4 ·位扩展:高位填充,从较小的数据类型转换成较大的类型 -无符号扩展(zero extension):高位补0 ·逻辑运算 32 Sign -符号扩展(sign extension):高位补1,补码 extend ·算术运算,地址偏移 需求:/S/SB-type,短立即数12位=>32位 -addi$s3,$s3,4;$s3=$s3+4 Imm Gen Iw $t1,offset($t2);$t1=M[$t2+offset] beq $1,$3,7;if($1=$3)then goto nPC+7,else not taken. I-type immediate[11:0] rs1 funct3 rd opcode S-type immed[11:5] rs2 rs1 funct3 immed[4:0] opcode
位扩展:短立即数=>32位立即数,$2.4 • 位扩展:高位填充,从较小的数据类型转换成较大的类型 – 无符号扩展(zero extension):高位补0 • 逻辑运算 – 符号扩展(sign extension):高位补1,补码 • 算术运算,地址偏移 • 需求:I/S/SB-type,短立即数12位=>32位 – addi $s3,$s3,4;$s3 = $s3 + 4 – lw $t1, offset($t2);$t1=M[$t2+offset] – beq $1, $3, 7;if($1=$3)then goto nPC+7, else not taken