日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RISC-V 常用汇编指令

發(fā)布時間:2024/3/12 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RISC-V 常用汇编指令 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

RISCV 常用匯編指令


相關(guān)寄存器

寄存器ABI 名用途Saver
x0zero讀取時總為 0, 寫入時不起任何效果-
x1ra存放函數(shù)返回地址 (return address)Caller
x2sp存放棧指針 (stack pointer)Callee
x3gpglobal pointer-
x4tpthread point-
x5 - x7t0 - t2臨時 (temporaries) 寄存器,Callee 可能會使用這些寄存器,所以 Callee 不保證這些寄存器中的值在函數(shù)調(diào)用過程中保持不變,這意味著對于 Caller 來說,如果需要的話,Caller 需要自己在調(diào)用 Callee 之前保存臨時寄存器中的值。Caller
x28 - x31t3 - t6臨時寄存器,同上Caller
x8 - x9s0/fp - s1保存 (saved) 寄存器,Callee 需要保證這些寄存器的值在函數(shù)返回后仍然維持函數(shù)調(diào)用之前的原值,所以一旦 Callee 在自己的函數(shù)中會用到這些寄存器則需要在棧中備份并在退出函數(shù)時進(jìn)行恢復(fù)。Callee
x18 - x27s2 - s11保存寄存器,同上Callee
x10 - x11a0 - a1參數(shù) (argument) 寄存器,用于在函數(shù)調(diào)用過程中保存第一個和第二個參數(shù),以及在函數(shù)返回時傳遞返回值。Caller
x12 - x17a2 - a7參數(shù) (argument) 寄存器,如果函數(shù)調(diào)用時需要傳遞更多的參數(shù),則可以用這些寄存器,但注意用于傳遞參數(shù)的寄存器最多只有 8 個 (a0 ~ a7) ,如果還有更多的參數(shù)則要利用棧。Caller

Caller :調(diào)用者,Callee : 被調(diào)用函數(shù)【這里可以視為在 Caller (函數(shù))中調(diào)用 Callee (函數(shù))】
Caller 維護(hù)的寄存器,在運(yùn)行被調(diào)函數(shù)前不會被保存,函數(shù)返回時這些寄存器可能會被改變,所以在調(diào)用前由 Caller 保存維護(hù)。
Callee 維護(hù)的寄存器,在運(yùn)行被調(diào)函數(shù)前會被保存,函數(shù)返回后這些寄存器與運(yùn)行被調(diào)函數(shù)前相同。


算術(shù)運(yùn)算指令

指令語法描述例子
addadd rd,rs1,rs2(rs1 + rs2) 的值保存到 rdadd x5,x6,x7
subsub rd,rs1,rs2(rs1 - rs2)的值保存到 rdsub x5,x6,x7
luilui rd,immrd = (imm << 12) (20位的立即數(shù)左移12位)lui x5,0x12345
auipcauipc rd,imm(20bit)rd = (imm << 12) + pc (相對 pc 的偏移值)auipc x5,0x1234
偽指令語法等價語句描述例子
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,immrd = imm (32bit) 直接加載32位立即數(shù)li x5,0x12345678
lala rd,addrrd = addr 加載地址到寄存器la x5,0x12345

邏輯運(yùn)算指令

指令語法描述例子
andand rd,rs1,rs2rd = (rs1 & rs2)and x5,x6,x7
oror rd,rs1,rs2rd = (rs1 | rs2)or x5,x6,x7
xorxor rd,rs1,rs2rd = (rs ^ rs2)xor x5,x6,x7
andiandi rd,rs,immrd = (rs & imm)andi x5,x6,10
oriori rd,rs,immrd = (rs | imm)ori x5,x6,20
xorixori rd,rs,immrd = (rs ^ imm)xori x5,x6,10
偽指令語法等價語句描述例子
notnot rd,rsxori rd,rs,-1按位取反not x5,x6

移位運(yùn)算指令

邏輯移位 補(bǔ)零

指令語法描述例子
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

算術(shù)移位(只有右移,補(bǔ)符號位)

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

內(nèi)存讀寫指令

imm 為12bit有符號整數(shù)

讀指令

指令語法描述例子
lblb rd,imm(rs)從內(nèi)存 imm+rs 處讀取8bit數(shù)據(jù)(符號拓展)到 rd 中(符號拓展)lb x5,40(x6)
lbulbu rd,imm(rs)從內(nèi)存 imm+rs 處讀取8bit無符號整數(shù)(0擴(kuò)展)到 rd 中(0擴(kuò)展)lbu x5,40(x6)
lhlh rd,imm(rs)從內(nèi)存 imm+rs 處讀取16bit數(shù)據(jù)(符號拓展)到 rd 中(符號拓展)lh x5,40(x6)
lhulhu rd,imm(rs)從內(nèi)存 imm+rs 處讀取16bit無符號整數(shù)(0擴(kuò)展)到 rd 中(0擴(kuò)展)lhu x5,40(x6)
lwlw rd,imm(rs)從內(nèi)存 imm+rs 處讀取32bit數(shù)據(jù)到 rd 中lw x5,40(x6)

寫指令

指令語法描述例子
sbsb rs2,imm(rs1)將rs2中的8bit數(shù)據(jù)寫入內(nèi)存 imm+rs1 處sb x5,40(x6)
shsh rs2,imm(rs1)將rs2中的16bit數(shù)據(jù)寫入內(nèi)存 imm+rs1 處sb x5,40(x6)
swsw rs2,imm(rs1)將rs2中的32bit數(shù)據(jù)寫入內(nèi)存 imm+rs1 處sb x5,40(x6)

條件分支指令

指令語法描述例子
beqbeq rs1,rs2,imm如果rs1 == rs2,跳轉(zhuǎn)到 imm 地址處beq x5,x6,100
bnebne rs1,rs2,imm如果rs1 != rs2,跳轉(zhuǎn)到 imm 地址處bne x5,x6,100
bltblt rs1,rs2,imm如果rs1 < rs2(有符號方式),跳轉(zhuǎn)blt x5,x6,100
bltubltu rs1,rs2,imm如果rs1 < rs2(無符號方式),跳轉(zhuǎn)bltu x5,x6,100
bgeblt rs1,rs2,imm如果rs1 >= rs2(有符號方式),跳轉(zhuǎn)bge x5,x6,100
bgeubltu rs1,rs2,imm如果rs1 >= rs2(無符號方式),跳轉(zhuǎn)bgeu x5,x6,100

跳轉(zhuǎn)的目標(biāo)地址計(jì)算方法(對齊):(imm<<1)+pc 具體編程時由標(biāo)號給出

偽指令語法等價語句例子
bleble rs1,rs2,offset如果 rs1 <= rs2,跳轉(zhuǎn)到 offset 地址處ble x5,x6,100
bleubleu rs1,rs2,offset如果 rs1 <= rs2(無符號),跳轉(zhuǎn)到 offset 地址處bequ x5,x6,100
bgtbgt rs1,rs2,offset如果 rs1 >= rs2,跳轉(zhuǎn)到 offset 地址處bgt x5,x6,100
bgtubgtu rs1,rs2,offset如果 rs1 >= rs2(無符號),跳轉(zhuǎn)到 offset 地址處bgtu x5,x6,100
beqzbeqz rs1,offset如果 rs1 == 0,跳轉(zhuǎn)到 offset 地址處beqz x5,x6,100
bnezbnez rs1,offset如果 rs1 != 0,跳轉(zhuǎn)到 offset 地址處bnez x5,x6,100
bltzbltz rs1,offset如果 rs1 < 0,跳轉(zhuǎn)到 offset 地址處bltz x5,x6,100
blezblez rs1,offset如果 rs1 <= 0,跳轉(zhuǎn)到 offset 地址處blez x5,x6,100
bgtzbgtz rs1,offset如果 rs1 > 0,跳轉(zhuǎn)到 offset 地址處bgtz x5,x6,100
bgezbgez rs1,offset如果 rs1 >= 0,跳轉(zhuǎn)到 offset 地址處bgez x5,x6,100

無條件跳轉(zhuǎn)指令

指令語法描述例子
jaljal rd,label指令的下一條指令地址存入rd,跳轉(zhuǎn)到label (20bit)jal x1,label
jalrjalr rd,imm(rs)12bit的imm符號拓展,(rs+imm)低位置0存到rd,跳轉(zhuǎn)jarl x1,0(x5)
偽指令語法等價語句描述
jj offsetjal x0,offset [不會保存跳轉(zhuǎn)前的地址]j label
jrjr rsjalr x0,0(rs) [不會保存跳轉(zhuǎn)前的地址]jr x5

函數(shù)調(diào)用

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

參考

  • 循序漸進(jìn),學(xué)習(xí)開發(fā)一個RISC-V上的操作系統(tǒng)
  • mit 6.S081

總結(jié)

以上是生活随笔為你收集整理的RISC-V 常用汇编指令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。