RISC-V常见指令
算术运算
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] %𝑠 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]
逻辑左移(空位补0)
slli rd, rs1, shamt
立即数逻辑左移
srl rd, rs1, rs2
x[rd] = (x[rs1] ≫𝑢 x[rs2])
逻辑右移(空位补0)
srli rd, rs1, shamt
立即数逻辑右移
sra rd, rs1, rs2
x[rd] = (x[rs1] ≫𝑠 x[rs2])
算术右移(空位用最高位填充)
srai rd, rs1, shamt
立即数逻辑右移
not td, rs1
x[rd] = ~x[rs1]
把寄存器 x[rs1]对于 1 的补码(即按位取反的值)写入 x[rd]。实际被扩展为 xori rd, rs1, -1。
条件控制指令
beq rs1, rs2, offset
if (rs1 == rs2) pc = sext(offset)
若寄存器 x[rs1]和寄存器 x[rs2]的值相等,把 pc 的值设为当前值加上符号位扩展的偏移 offset。
bge rs1, rs2, offset
if (rs1 ≥s rs2) pc = sext(offset)
若寄存器 x[rs1]的值大于等于寄存器 x[rs2]的值(均视为二进制补码),把 pc 的值设为当前 值加上符号位扩展的偏移 offset。
blt 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(jump and link ) 使用20位立即数(有符号)作为偏移量(offset),该偏移量乘以2,然后与该指令的PC相加,生成得到最终的跳转目标地址。可以跳转到前后1MB的地址区间。将下一条指令PC(当前PC+4)的值,写入结果寄存器rd中。
PS:一般,跳转的目标往往使用汇编程序中的label,汇编器根据label自动计算偏移量 - jalr(jump and link register) :12位偏移量,加上rs1中的值,得到最终的跳转目标地址。将下一条指令PC(当前PC+4)的值,写入结果寄存器rd中。
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)。
今天的文章
riscv常见指令_ADD指令分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/61159.html