生活随笔
收集整理的這篇文章主要介紹了
RISC-V 常用汇编指令
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
RISCV 常用匯編指令
相關(guān)寄存器
寄存器ABI 名用途Saver
| x0 | zero | 讀取時(shí)總為 0, 寫(xiě)入時(shí)不起任何效果 | - |
| x1 | ra | 存放函數(shù)返回地址 (return address) | Caller |
| x2 | sp | 存放棧指針 (stack pointer) | Callee |
| x3 | gp | global pointer | - |
| x4 | tp | thread point | - |
| x5 - x7 | t0 - t2 | 臨時(shí) (temporaries) 寄存器,Callee 可能會(huì)使用這些寄存器,所以 Callee 不保證這些寄存器中的值在函數(shù)調(diào)用過(guò)程中保持不變,這意味著對(duì)于 Caller 來(lái)說(shuō),如果需要的話(huà),Caller 需要自己在調(diào)用 Callee 之前保存臨時(shí)寄存器中的值。 | Caller |
| x28 - x31 | t3 - t6 | 臨時(shí)寄存器,同上 | Caller |
| x8 - x9 | s0/fp - s1 | 保存 (saved) 寄存器,Callee 需要保證這些寄存器的值在函數(shù)返回后仍然維持函數(shù)調(diào)用之前的原值,所以一旦 Callee 在自己的函數(shù)中會(huì)用到這些寄存器則需要在棧中備份并在退出函數(shù)時(shí)進(jìn)行恢復(fù)。 | Callee |
| x18 - x27 | s2 - s11 | 保存寄存器,同上 | Callee |
| x10 - x11 | a0 - a1 | 參數(shù) (argument) 寄存器,用于在函數(shù)調(diào)用過(guò)程中保存第一個(gè)和第二個(gè)參數(shù),以及在函數(shù)返回時(shí)傳遞返回值。 | Caller |
| x12 - x17 | a2 - a7 | 參數(shù) (argument) 寄存器,如果函數(shù)調(diào)用時(shí)需要傳遞更多的參數(shù),則可以用這些寄存器,但注意用于傳遞參數(shù)的寄存器最多只有 8 個(gè) (a0 ~ a7) ,如果還有更多的參數(shù)則要利用棧。 | Caller |
Caller :調(diào)用者,Callee : 被調(diào)用函數(shù)【這里可以視為在 Caller (函數(shù))中調(diào)用 Callee (函數(shù))】
Caller 維護(hù)的寄存器,在運(yùn)行被調(diào)函數(shù)前不會(huì)被保存,函數(shù)返回時(shí)這些寄存器可能會(huì)被改變,所以在調(diào)用前由 Caller 保存維護(hù)。
Callee 維護(hù)的寄存器,在運(yùn)行被調(diào)函數(shù)前會(huì)被保存,函數(shù)返回后這些寄存器與運(yùn)行被調(diào)函數(shù)前相同。
算術(shù)運(yùn)算指令
指令語(yǔ)法描述例子
| add | add rd,rs1,rs2 | (rs1 + rs2) 的值保存到 rd | add x5,x6,x7 |
| sub | sub rd,rs1,rs2 | (rs1 - rs2)的值保存到 rd | sub x5,x6,x7 |
| lui | lui rd,imm | rd = (imm << 12) (20位的立即數(shù)左移12位) | lui x5,0x12345 |
| auipc | auipc rd,imm(20bit) | rd = (imm << 12) + pc (相對(duì) pc 的偏移值) | auipc x5,0x1234 |
偽指令語(yǔ)法等價(jià)語(yǔ)句描述例子
| neg | neg rd,rs | sub rd,x0,rs | rd = ~rs (取反) | neg x5,x6 |
| mv | mov rd,rs | addi rd,rs,0 | rd = rs | mov x5,x6 |
| nop | nop | addi x0,x0,0 | 空指令 | nop |
| li | li rd,imm | … | rd = imm (32bit) 直接加載32位立即數(shù) | li x5,0x12345678 |
| la | la rd,addr | … | rd = addr 加載地址到寄存器 | la x5,0x12345 |
邏輯運(yùn)算指令
指令語(yǔ)法描述例子
| and | and rd,rs1,rs2 | rd = (rs1 & rs2) | and x5,x6,x7 |
| or | or rd,rs1,rs2 | rd = (rs1 | rs2) | or x5,x6,x7 |
| xor | xor rd,rs1,rs2 | rd = (rs ^ rs2) | xor x5,x6,x7 |
| andi | andi rd,rs,imm | rd = (rs & imm) | andi x5,x6,10 |
| ori | ori rd,rs,imm | rd = (rs | imm) | ori x5,x6,20 |
| xori | xori rd,rs,imm | rd = (rs ^ imm) | xori x5,x6,10 |
偽指令語(yǔ)法等價(jià)語(yǔ)句描述例子
| not | not rd,rs | xori rd,rs,-1 | 按位取反 | not x5,x6 |
移位運(yùn)算指令
邏輯移位 補(bǔ)零
指令語(yǔ)法描述例子
| sll | sll rd,rs1,rs2 | (rs1 << rs2) | sll x5,x6,x7 |
| srl | srl rd,rs1,rs2 | (rs1 >> rs2) | srl x5,x6,x7 |
| slli | sll rd,rs1,imm | (rs1 << imm) | slli x5,x6,10 |
| srli | srl rd,rs1,imm | rd = (rs1 >> imm) | srli x5,x6,20 |
算術(shù)移位(只有右移,補(bǔ)符號(hào)位)
指令語(yǔ)法描述例子
| sra | sra rd,rs1,rs2 | rd = (rs1 << rs2) | sra x5,x6,x7 |
| srai | srai rd,rs1,imm | rd = (rs1 >> imm) | srl x5,x6,20 |
內(nèi)存讀寫(xiě)指令
imm 為12bit有符號(hào)整數(shù)
讀指令
指令語(yǔ)法描述例子
| lb | lb rd,imm(rs) | 從內(nèi)存 imm+rs 處讀取8bit數(shù)據(jù)(符號(hào)拓展)到 rd 中(符號(hào)拓展) | lb x5,40(x6) |
| lbu | lbu rd,imm(rs) | 從內(nèi)存 imm+rs 處讀取8bit無(wú)符號(hào)整數(shù)(0擴(kuò)展)到 rd 中(0擴(kuò)展) | lbu x5,40(x6) |
| lh | lh rd,imm(rs) | 從內(nèi)存 imm+rs 處讀取16bit數(shù)據(jù)(符號(hào)拓展)到 rd 中(符號(hào)拓展) | lh x5,40(x6) |
| lhu | lhu rd,imm(rs) | 從內(nèi)存 imm+rs 處讀取16bit無(wú)符號(hào)整數(shù)(0擴(kuò)展)到 rd 中(0擴(kuò)展) | lhu x5,40(x6) |
| lw | lw rd,imm(rs) | 從內(nèi)存 imm+rs 處讀取32bit數(shù)據(jù)到 rd 中 | lw x5,40(x6) |
寫(xiě)指令
指令語(yǔ)法描述例子
| sb | sb rs2,imm(rs1) | 將rs2中的8bit數(shù)據(jù)寫(xiě)入內(nèi)存 imm+rs1 處 | sb x5,40(x6) |
| sh | sh rs2,imm(rs1) | 將rs2中的16bit數(shù)據(jù)寫(xiě)入內(nèi)存 imm+rs1 處 | sb x5,40(x6) |
| sw | sw rs2,imm(rs1) | 將rs2中的32bit數(shù)據(jù)寫(xiě)入內(nèi)存 imm+rs1 處 | sb x5,40(x6) |
條件分支指令
指令語(yǔ)法描述例子
| beq | beq rs1,rs2,imm | 如果rs1 == rs2,跳轉(zhuǎn)到 imm 地址處 | beq x5,x6,100 |
| bne | bne rs1,rs2,imm | 如果rs1 != rs2,跳轉(zhuǎn)到 imm 地址處 | bne x5,x6,100 |
| blt | blt rs1,rs2,imm | 如果rs1 < rs2(有符號(hào)方式),跳轉(zhuǎn) | blt x5,x6,100 |
| bltu | bltu rs1,rs2,imm | 如果rs1 < rs2(無(wú)符號(hào)方式),跳轉(zhuǎn) | bltu x5,x6,100 |
| bge | blt rs1,rs2,imm | 如果rs1 >= rs2(有符號(hào)方式),跳轉(zhuǎn) | bge x5,x6,100 |
| bgeu | bltu rs1,rs2,imm | 如果rs1 >= rs2(無(wú)符號(hào)方式),跳轉(zhuǎn) | bgeu x5,x6,100 |
跳轉(zhuǎn)的目標(biāo)地址計(jì)算方法(對(duì)齊):(imm<<1)+pc 具體編程時(shí)由標(biāo)號(hào)給出
偽指令語(yǔ)法等價(jià)語(yǔ)句例子
| ble | ble rs1,rs2,offset | 如果 rs1 <= rs2,跳轉(zhuǎn)到 offset 地址處 | ble x5,x6,100 |
| bleu | bleu rs1,rs2,offset | 如果 rs1 <= rs2(無(wú)符號(hào)),跳轉(zhuǎn)到 offset 地址處 | bequ x5,x6,100 |
| bgt | bgt rs1,rs2,offset | 如果 rs1 >= rs2,跳轉(zhuǎn)到 offset 地址處 | bgt x5,x6,100 |
| bgtu | bgtu rs1,rs2,offset | 如果 rs1 >= rs2(無(wú)符號(hào)),跳轉(zhuǎn)到 offset 地址處 | bgtu x5,x6,100 |
| beqz | beqz rs1,offset | 如果 rs1 == 0,跳轉(zhuǎn)到 offset 地址處 | beqz x5,x6,100 |
| bnez | bnez rs1,offset | 如果 rs1 != 0,跳轉(zhuǎn)到 offset 地址處 | bnez x5,x6,100 |
| bltz | bltz rs1,offset | 如果 rs1 < 0,跳轉(zhuǎn)到 offset 地址處 | bltz x5,x6,100 |
| blez | blez rs1,offset | 如果 rs1 <= 0,跳轉(zhuǎn)到 offset 地址處 | blez x5,x6,100 |
| bgtz | bgtz rs1,offset | 如果 rs1 > 0,跳轉(zhuǎn)到 offset 地址處 | bgtz x5,x6,100 |
| bgez | bgez rs1,offset | 如果 rs1 >= 0,跳轉(zhuǎn)到 offset 地址處 | bgez x5,x6,100 |
無(wú)條件跳轉(zhuǎn)指令
指令語(yǔ)法描述例子
| jal | jal rd,label | 指令的下一條指令地址存入rd,跳轉(zhuǎn)到label (20bit) | jal x1,label |
| jalr | jalr rd,imm(rs) | 12bit的imm符號(hào)拓展,(rs+imm)低位置0存到rd,跳轉(zhuǎn) | jarl x1,0(x5) |
偽指令語(yǔ)法等價(jià)語(yǔ)句描述
| j | j offset | jal x0,offset [不會(huì)保存跳轉(zhuǎn)前的地址] | j label |
| jr | jr rs | jalr x0,0(rs) [不會(huì)保存跳轉(zhuǎn)前的地址] | jr x5 |
函數(shù)調(diào)用
偽指令語(yǔ)法等價(jià)語(yǔ)句描述例子
| jal | jal offset | jal x1,offset | 保存返回地址到x1,跳轉(zhuǎn)到 offset | jal label |
| jalr | jalr rs | jalr x1,0(rs) | 保存返回地址到x1,跳轉(zhuǎn)到rs寄存器保存的地址 | jalr label |
| call | call offset | auipc x1,offset[31:12]+offset[11];jalr x1,ofsset[11:0] (x1) | – | call fun |
| ret | ret | jalr x0,0(x1) | 返回 | ret |
參考
- 循序漸進(jìn),學(xué)習(xí)開(kāi)發(fā)一個(gè)RISC-V上的操作系統(tǒng)
- mit 6.S081
總結(jié)
以上是生活随笔為你收集整理的RISC-V 常用汇编指令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。