算数运算
add rd,rs1,rs2
x[rd] = x[rs1] + x[rs2]
把寄存器x[rs2]加到寄存器x[rs1]上,结果写入x[rd].忽略算术溢出。
addi rd,rs1,immediate
x[rd] = x[rs1] + sext(immediate)
把符号位扩展的立即数加到寄存器x[rs1]上,结果写入x[rd]。忽略算术溢出
sub rd,rs1,rs2
x[rd] = x[rs1] - x[rs2]
x[rs1]减去x[rs2],结果写入x[rd].忽略算术溢出
div rd,rs1,rs2
x[rd] = x[rs1] ÷s x[rs2]
用寄存器x[rs1]的值除以寄存器x[rs2]的值,向零舍入,将这些数视为二进制补码,把商写入x[rd]
mul rd,rs1,rs2
x[rd] = x[rs1] * x[rs2]
把寄存器x[rs2]乘到寄存器x[rs1]上,乘积吸入x[rd].忽略算术溢出
rem rd,rs1,rs2
x[rd] = x[rs1] %s x[rs2]
求余数,x[rs1]除以x[rs2],向0舍入,都视为2的补码,余数写入x[rd]
neg rd,rs2
x[rd] = -x[rs2]
把寄存器x[rs2]的二进制补码写入x[rd]
逻辑运算
and rd,rs1,rs2
x[rd] = x[rs1] & x[rs2]
将寄存器x[rs1]和寄存器x[rs2]位与的结果写入x[rd]
andi rd,rs1,immediate
x[rd] = x[rs1] & sext(immediate)
把符号位扩展的立即数和寄存器x[rs1]上的值进行位与,结果写入x[rd]
or rd,rs1,rs2
x[rd] = ~x[rs1]
把寄存器x[rs1]和寄存器x[rs2]按位取或,结果写入x[rd]
xor rd,rs1,immediate
x[rd] = x[rs1] ^sext(immediate)
x[rs1]和有符号扩展的immediate按位异或,结果写入x[rd]
位运算
sll rd,rs1,rs2
x[rd] = x[rs1] << x[rs2]
逻辑左移(空位补零)
slli rd,rs1,shamt
立即数逻辑左移
sr1 rd,rs1,rs2
x[rd] = (x[rs1] >> u x[rs2])
逻辑右移(空位补零)
srli rd,rs1,shamt
立即数逻辑右移
sra rd,rs1,rs2
x[rd] = (x[rs1] >> s x[rs2])
算术右移(空位用最高位填充)
srai rd,rs1,shamt
立即数逻辑右移
not td,rs1
x[rd] = ~x[rs1]
把寄存器x[rs1] 对于1的补码(即按位取反的值)写入x[rd].实际扩展为xori rd,rs1,-1.
条件控制指令
beg rs1,rs2,offset
if(rs1 == rs2) pc+= sext(offset)
若寄存器x[rs1]和寄存器x[rs2]的值相等,把pc的值设为当前值加上符号位扩展的偏移offset
bge rs1,rs2,offset
if(rs1 >= rs2) pc += sext(offset)
若寄存器x[rs1]的值大于寄存器x[rs2]的值(均视为二进制补码),把pc的值设为当前值加上符号位扩展的偏移offset
bit rs1,rs2,offset
if(rs1 <s rs2) pc += sext(offset)
若寄存器x[rs1]的值小于寄存器x[rs2]的值(均视为二进制补码),把pc的值设为当前值加上符号位扩展的偏移offset
bne rs1,rs2,offset
if(rs1 != rs2) pc += sext(offset)
若寄存器x[rs1]和寄存器x[rs2]的值不相等,把pc的值设为当前值加上符号位扩展的便宜offset
跳转指令
j offset
pc+= sext(offset)
把pc设置为当前值加上符号位扩展的offset,等同于jal x0,offset
jal rd,offset
x[rd] = pc+4; pc += sext(offset)
把下一条指令的地址(pc+4),然后把pc设位置当前值加上符号位扩展的offset,rd默认为x1
jr rs1
pc = x[rs1]
把pc设置为x[rs1],等同于 jalr x0,0(rs1)
jalr rd,offset(rs1)
t = pc +4; pc = (x[rs1] + sext(offset)) &~1;
x[rd] = t
把pc设置位x[rs1] + sign - extend(offset),把计算出的地址的最低有效位设为0,并将原pc+4的值写入f(rd).rd默认为x1
ret
pc = x[1]
从子过程返回,实际被扩展为jalr x0,0(x1)
加载与存储指令
la rd,symbol
x[rd] = &symbol
将symbol的地址加载到x[rd]中
li rd,immediate
x[rd] = immediate
将常量加载到x[rd]中
lw rd,offset(rs1)
x[rd] = sext(M[x[rs1] +sext(offset)][31:0])
从地址x[rs1] +sign-extend(offset)读取四个字节,写入x[rd]
sw rs2,offset(rs1)
M[x[rs1] + sext(offset) = x[rs2][31:0]
将x[rs2]的低位4个字节存入地址x[rs1] + sign-extend(offset)