RISC-V 常用汇编指令集

本文详细介绍了RISC-V架构的常用汇编指令,包括寄存器分配、算术、逻辑、移位、内存操作、条件分支、无条件跳转和函数调用,以及sext.w指令示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RISC-V 常用汇编指令集

一、 通用寄存器介绍

寄 存 器 ABI名 用途Saver
x0zero读取时总为 0, 写入时不起任何效果 (只有读RO 权限)-
x1ra存放函数返回地址 (return address)Caller
x2sp存放栈指针 (stack pointer)Callee
x3gpglobal pointer-
x4tpthread point-
x5 - x7t0 - t2临时 (temporaries) 寄存器,Callee 可能会使用这些寄存器,所以 Callee 不保证这些寄存器中的值在函数调用过程中保持不变,这意味着对于 Caller 来说,如果需要的话,Caller 需要自己在调用 Callee 之前保存临时寄存器中的值。Caller
x8 - x9s0/fp - s1保存 (saved) 寄存器,Callee 需要保证这些寄存器的值在函数返回后仍然维持函数调用之前的原值,所以一旦 Callee 在自己的函数中会用到这些寄存器则需要在栈中备份并在退出函数时进行恢复Callee
x10 - x11a0 - a1参数 (argument) 寄存器,用于在函数调用过程中保存第一个和第二个参数,以及在函数返回时传递返回值。Caller
x12 - x17a2 - a7参数 (argument) 寄存器,如果函数调用时需要传递更多的参数,则可以用这些寄存器,但注意用于传递参数的寄存器最多只有 8 个 (a0 ~ a7) ,如果还有更多的参数则要利用栈。Caller
x18 - x27s2 - s11保存 (saved) 寄存器,Callee 需要保证这些寄存器的值在函数返回后仍然维持函数调用之前的原值,所以一旦 Callee 在自己的函数中会用到这些寄存器则需要在栈中备份并在退出函数时进行恢复。Callee
x28 - x31t3 - t6临时 (temporaries) 寄存器,Callee 可能会使用这些寄存器,所以 Callee 不保证这些寄存器中的值在函数调用过程中保持不变,这意味着对于 Caller 来说,如果需要的话,Caller 需要自己在调用 Callee 之前保存临时寄存器中的值。Caller

Caller :调用者

Callee : 被调用函数

static void Caller (void)
{
    Callee ();
}

  
  • 1
  • 2
  • 3
  • 4

二、算术运算指令

指令语法描述例子
addadd rd,rs1,rs2rd = rs1 + rs2add x5,x6,x7
addiaddi a0, a0, 4a0 = a0 + 4, 加立即数,并且检查溢出addi a0, a0, 4
subsub rd,rs1,rs2(rs1 - rs2)的值保存到 rdsub x5,x6,x7
luilui rd,immrd = (imm << 12) (20位的立即数左移12位)lui x5,0x12345
auipcauipc rd,imm(20bit)rd = (imm << 12) + pc (相对 pc 的偏移值)auipc x5,0x1234

三、逻辑运算

指令语法描述例子
and 与运算and rd,rs1,rs2rd = (rs1 & rs2)and x5,x6,x7
or 或运算or rd,rs1,rs2rd = (rs1rs2)
xor 异或运算xor rd,rs1,rs2rd = (rs ^ rs2)xor x5,x6,x7
andi 与立即数andi rd,rs,immrd = (rs & imm)andi x5,x6,10
ori 或立即数ori rd,rs,immrd = (rsimm)
xori 异或立即数xori rd,rs,immrd = (rs ^ imm)xori x5,x6,10

立即数可以理解成C 语言里的常数

四、伪指令

伪指令语法等价语句描述例子
negneg rd,rssub rd,x0,rsrd = ~rs (取反)neg x5,x6
mvmov rd,rsaddi rd,rs,0rd = rsmov x5,x6
nopnopaddi x0,x0,0空指令nop
lili rd,imm- -rd = imm (32bit) 直接加载32位立即数li x5,0x12345678
lala rd,addr- -rd = addr 加载地址到寄存器la x5,0x12345
notnot rd,rsxori rd,rs,-1按位取反not x5,x6

五、 移位运算指令

5.1、逻辑移位,补零

指令语法描述例子
sllsll rd,rs1,rs2(rs1 << rs2)sll x5,x6,x7
srlsrl rd,rs1,rs2(rs1 >> rs2)srl x5,x6,x7
sllisll rd,rs1,imm(rs1 << imm)slli x5,x6,10
srlisrl rd,rs1,immrd = (rs1 >> imm)srli x5,x6,20

5.2、 0x01 << 3 (0000 0001) --> (0000 1000) 0x08 低 三位补 0

5.3、算术移位

指令语法描述例子
srasra rd,rs1,rs2rd = (rs1 << rs2)sra x5,x6,x7
sraisrai rd,rs1,immrd = (rs1 >> imm)srl x5,x6,20

六、 内存读写指令

注释: imm 为12 bits 有符号整数(立即数)

6.1、读指令

指令语法描述例子
lblb rd,imm(rs)从内存 imm + rs 处读取8bit数据(符号拓展)到 rd 中(符号拓展)lb x5,40(x6)
lbulbu rd,imm(rs)从内存 imm + rs 处读取8bit无符号整数(0扩展)到 rd 中(0扩展)lbu x5,40(x6)
lhlh rd,imm(rs)从内存 imm+rs 处读取16bit数据(符号拓展)到 rd 中(符号拓展)lh x5,40(x6)
lhulhu rd,imm(rs)从内存 imm+rs 处读取16bit无符号整数(0扩展)到 rd 中(0扩展)lhu x5,40(x6)
lwlw rd,imm(rs)从内存 imm+rs 处读取32bit数据到 rd 中lw x5,40(x6)

6.2、 写指令

指令语法描述例子
sbsb rs2,imm(rs1)将rs2中的8bit数据写入内存 imm+rs1 处sb x5,40(x6)
shsh rs2,imm(rs1)将rs2中的16bit数据写入内存 imm+rs1 处sb x5,40(x6)
swsw rs2,imm(rs1)将rs2中的32bit数据写入内存 imm+rs1 处sb x5,40(x6)

七、条件分支指令

7.1、条件指令

指令语法描述例子
beqbeq rs1,rs2,imm如果rs1 == rs2,跳转到 imm 地址处beq x5,x6,100
bnebne rs1,rs2,imm如果rs1 != rs2,跳转到 imm 地址处bne x5,x6,100
bltblt rs1,rs2,imm如果rs1 < rs2(有符号方式),跳转blt x5,x6,100
bltubltu rs1,rs2,imm如果rs1 < rs2(无符号方式),跳转bltu x5,x6,100
bgeblt rs1,rs2,imm如果rs1 >= rs2(有符号方式),跳转bge x5,x6,100
bgeubltu rs1,rs2,imm如果rs1 >= rs2(无符号方式),跳转bgeu x5,x6,100

注释:跳转的目标地址计算方法(对齐):(imm<<1)+pc 具体编程时由标号给出

7.2、伪指令

伪指令语法描述例子
bleble rs1,rs2,offset如果 rs1 <= rs2,跳转到 offset 地址处ble x5,x6,100
bleubleu rs1,rs2,offset如果 rs1 <= rs2(无符号),跳转到 offset 地址处bequ x5,x6,100
bgtbgt rs1,rs2,offset如果 rs1 >= rs2,跳转到 offset 地址处bgt x5,x6,100
bgtubgtu rs1,rs2,offset如果 rs1 >= rs2(无符号),跳转到 offset 地址处bgtu x5,x6,100
beqzbeqz rs1,offset如果 rs1 == 0,跳转到 offset 地址处beqz x5,x6,100
bnezbnez rs1,offset如果 rs1 != 0,跳转到 offset 地址处bnez x5,x6,100
bltzbltz rs1,offset如果 rs1 < 0,跳转到 offset 地址处bltz x5,x6,100
blezblez rs1,offset如果 rs1 <= 0,跳转到 offset 地址处blez x5,x6,100
bgtzbgtz rs1,offset如果 rs1 > 0,跳转到 offset 地址处bgtz x5,x6,100
bgezbgez rs1,offset如果 rs1 >= 0,跳转到 offset 地址处bgez x5,x6,100

八、无条件跳转指令

8.1、无条件跳转指令

指令语法描述例子
jaljal rd,label指令的下一条指令地址存入rd,跳转到label (20bit)jal x1,label
jalrjalr rd,imm(rs)12bit的imm符号拓展,(rs+imm)低位置0存到rd,跳转jarl x1,0(x5)

8.2 伪指令

指令语法描述例子
jj offsetjal x0,offset [不会保存跳转前的地址]j label
jrjr rsjalr x0,0(rs) [不会保存跳转前的地址]jr x5

九、函数调用

9.1、伪指令

指令语法等价语句描述例子
jaljal offsetjal x1,offset保存返回地址到x1,跳转到 offsetjal label
jalrjalr rsjalr x1,0(rs)保存返回地址到x1,跳转到rs寄存器保存的地址jalr label
callcall offsetauipc x1,offset[31:12]+offset[11];jalr x1,ofsset[11:0] (x1)- -call fun
retretjalr x0,0(x1)返回ret

能举一个risc-v指令集中的sext.w指令的范例吗?
可以,sext.w指令的作用是将一个16位的有符号数扩展为32位的有符号数,例如:

lw t0, 0(s0) # 从地址s0+0处读取一个16位的有符号数 sext.w t1, t0 # 将t0中的16位有符号数扩展为32位有符号数,并存储到t1中

注意:以上回答仅供参考,具体实现方式可能因处理器架构和编译器而异

### 关于RISC-V指令集的相关信息 RISC-V是一种开源的指令集架构(ISA),其设计旨在提供一种简单、模块化和可扩展的基础结构,适用于各种计算设备。官方文档《RISC-V指令集手册-v2.1中文版》提供了详细的说明[^1]。 #### RISC-V指令分类 RISC-V指令集分为基础指令集和扩展指令集两部分。基础指令集中最常用的是RV32I,它定义了一组核心整数操作指令。扩展指令集则通过字母标记不同的功能集合,例如M代表乘法/除法扩展,A代表原子操作扩展等。特别地,“G”是一个常用的缩写,表示一组常见的指令集组合IMAFD[^2]。 #### 跳转与链接(JAL)指令 对于特定类型的指令如跳转和链接(JAL),它们采用J类型格式编码。这种格式允许以2字节为单位对偏移量进行编码,从而实现±1MiB范围内的程序控制转移。执行JAL指令时,会将下一条指令的地址保存至指定寄存器rd中,默认情况下使用x1作为返回地址寄存器[^4]。 以下是展示如何利用Python模拟简单的JAL行为的一个例子: ```python def jal_simulation(pc, immediate_value, rd_register='x1'): target_address = pc + (immediate_value << 1) next_instruction_address = pc + 4 # Save the address of the instruction after JAL to the specified register. registers[rd_register] = next_instruction_address return target_address # Example usage with a hypothetical PC value and an immediate offset. current_pc = 0x80001000 offset = 0x1F8 # This is just an example offset that fits within ±1 MiB range. new_target = jal_simulation(current_pc, offset) print(f"Jumping to new target address: {hex(new_target)}") ``` 此代码片段仅用于演示目的,并未考虑实际硬件约束或完整的RISC-V环境设置。 #### 获取RISC-V指令表资源 要获取最新的RISC-V指令集架构官方资料及其相关表格,建议访问官方网站或者查阅最新版本的手册。上述提到的内容来源于GitCode上的项目页面,具体可以参考以下链接进一步了解:https://gitcode.com/Open-source-documentation-tutorial/c6ae1。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值