【RISC-V 常用汇编指令集】

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 ();
}

二、算术运算指令

指令语法描述例子
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
  • 5
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值