Format Instruction Opcode Funct3 Funct6/7 add 0110011 000 0000000 RV整数指令操作码 sub 0110011 000 0100000 s11 0110011 001 0000000 xor 0110011 100 0000000 R-type srl 0110011 101 0000000 sra 0110011 101 0000000 ·常用37条,图2-18 or 0110011 110 0000000 and 0110011 111 0000000 一按字长分类 Ir.d 0110011 011 0001000 sc.d 0110011 011 0001100 ·b,w,d,h 1b 0000011 000 n.a. 1h 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 lwu 0000011 110 n.a. 典型:按功能分类 addi 0010011 000 n.a. s111 0010011 001 000000 ALU xori 0010011 100 n.a. srli 0010011 101 000000 ·add:R-type srai 0010011 101 010000 ori 0010011 110 n.a. - 访存 andi 0010011 111 n.a. jalr 1100111 000 n.a. ·ld:load,-type sb 0100011 000 n.a. sh 0100011 001 n.a. ·sd:store,S-type S-type SW 0100011 010 n.a. 一分支 sd 0100011 111 n.a. beg 1100111 000 n.a. ·beq:SB-type bne 1100111 001 n.a. blt 1100111 100 n.a. ·jal,jalr SB-type bge 1100111 101 n.a. bltu 1100111 110 n.a. 总51条:图2-1:2-37:3-12 bgeu 1100111 111 n.a. U-type lui 0110111 n.a. n.a. U小type e1 1101111 n.a. n.a
RV整数指令操作码 • 常用37条,图2-18 – 按字长分类 • b,w,d,h – 按数据类型分类 • i,u – 按指令格式分类 • 典型:按功能分类 – ALU • add:R-type – 访存 • ld:load,I-type • sd:store,S-type – 分支 • beq:SB-type • jal,jalr • 总51条:图2-1;2-37;3-12
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(s1) -算逻指令均为寄存器寻址,load/store.为基址寻址 机器指令与汇编指令中源操作数和目的操作数的位置对应关系 -汇编指令:x2X3为源操作数rs1rs2,x1为目的操作数rd 注意S-type:x1=rs2(源),x2=rs1(基址),rs2=>mem[rs1+1000]
• 汇编指令寻址方式表示 – 寄存器寻址-名,立即数寻址-十进制/16进制,基址寻址-1000(rs1) – 算逻指令均为寄存器寻址,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 ·x0固定为“0” 。data move:reg-reg 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,L1 非ifn>=1,g0t0L1 。Goto:beqx0,x0,Exit
$zero:x0寄存器,$2.3.2 • x0固定为“0” • data move:reg-reg • 寄存器赋值 • Compare • Goto:beq x0,x0,Exit
位扩展:短立即数=>长立即数,$2.4 位扩展:从较小的数据类型转换成较大的类型 -无符号扩展(zero extension):高位补0 ·逻辑运算 -符号扩展(sign extension):高位补1,补码 ·算术运算,地址偏移 需求:I/S-type,短立即数12位=>32位 Imm -addi$s3,$s3,4;$s3=$s3+4 Gen Iw $t1,offset($t2);$t1=M[$t2+offset] beq $1,$3,7;if($1=$3)then taken,else not taken I-type immediate[11:0] rs1 funct3 rd opcode S-type immed[11:5] rs2 rs1 funct3 immed[4:0] opcode
位扩展:短立即数=>长立即数,$2.4 • 位扩展:从较小的数据类型转换成较大的类型 – 无符号扩展(zero extension):高位补0 • 逻辑运算 – 符号扩展(sign extension):高位补1,补码 • 算术运算,地址偏移 • 需求:I/S-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 taken, else not taken
生成32位常数,“双指令序列”法,$2.10.1 ·计算 一-取20位立即数:取左移12位后的20位立即数 lui:load upper immediate,U-type - 加载20位立即数到[31:12],符号扩展[63:32]=[31],[11:0]=0 -例:Iuix5,0x12345;5=0x12345000 -+低12位 ·addi:l-type 0 长跳转:寻址32位地址空间 -Iui:取高20位 ·例:luix5,0x12345;—$2.18的auipc? jalr:jump link reg,l-type ·高20位+低12位,一注意:间接跳转,非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],符号扩展[63:32]=[31],[11:0]=0 – 例:lui x5,0x12345;x5=0x1234 5000 – +低12位 • addi:I-type • 长跳转:寻址32位地址空间 – lui:取高20位 • 例: lui x5,0x12345;——$2.18的auipc? – jalr:jump & link reg,I-type • 高20位+低12位,——注意:间接跳转,非PC相对寻址! • 例:jalr x1,100(x5);x1=PC+4,goto x5+100