RISC-V匯編學習(三)—— RV指令集

有了前兩節對于RISC-V匯編、寄存器、匯編語法等的認識,本節開始介紹RISC-V指令集和偽指令。

前面說了RISC-V的模塊化特點,是以RV32I為作為ISA的核心模塊,其他都是要基于此為基礎,可以這樣認為:RISC-V ISA = 基本整數指令集+多個可選擴展指令集;另外RISC-V的ISA spec上是從指令類型和指令格式開始介紹指令的;但從一個嵌入式軟件開發人員的角度來說,不是特別適合學習和記憶,所以我這里簡單羅列下,不多講解,感興趣可以參考spec。

1 指令類型

1.1 組成格式

在這里插入圖片描述
所有RISC-V指令都是固定長度的32位,這有助于簡化指令解碼過程。每個指令都由以下幾個關鍵部分組成:

  • opcode:這是7位的操作碼,用來標識指令的基本類型。
  • funct3:這是一個3位的功能碼,與opcode一起使用以進一步細化指令的類別。
  • funct7:某些指令使用額外的7位功能碼來更精確地定義指令的行為。
  • rs1/rs2/rd:這些是5位的寄存器地址,分別代表源寄存器1、源寄存器2和目的寄存器。
  • imm:立即數字段,其大小和位置根據指令類型的不同而變化。

1.2 類型

RISC-V定義了幾種基本的指令格式,每一種都針對特定類型的運算或操作。這些格式包括:R型、I型、S型、B型、U型、J型。

  • R型(Register)
    用于寄存器間的算術/邏輯運算(如ADD x1, x2, x3)
    字段:opcode確定操作類型,funct3和funct7進一步指定具體操作(如區分ADD與SUB)

  • I型(Immediate)
    用于立即數操作(如ADDI x1, x2, 42)或加載指令(如LW x1, 100(x2))
    立即數:12位符號擴展,直接嵌入指令中

  • S型(Store)
    存儲數據到內存(如SW x3, 200(x4))
    立即數:12位拆分為imm[11:5]和imm[4:0],組合后作為偏移地址。

  • B型(Branch)
    條件分支(如BEQ x1, x2, label)
    立即數:13位(符號擴展后左移1位),拆分為imm[12|10:5|4:1|11],支持更大跳轉范圍

  • U型(Upper Immediate)
    加載高20位立即數(如LUI x1, 0x12345)或構造地址(如AUIPC)
    立即數:20位直接嵌入高位,低12位由后續指令補充

  • J型(Jump)
    長距離無條件跳轉(如JAL x1, label)
    立即數:20位符號擴展后左移1位,支持±1MB跳轉范圍

但在實際應用中,我們也很難記住這么匯編指令機器碼,一般情況下也不會有錯,具體可以參考spec。

2 指令命名

下圖是RV32I基礎指令集的??圖形表示,將有下劃線的字?從左到右連接起來,即可組成完整的RV32I指令集。集合標志{}內列舉了指令的所有變體,變體?加下劃線的字?或下劃線字符_表示,特別的,下劃線字符_表示對于此指令變體不需?字符表示
在這里插入圖片描述

以slt指令為例,如下示意圖:大括號{ }內列舉了每組指令的所有變體,這些變體通過帶下滑線的字母(單獨的下劃線_表示空字段),從左到右連接帶下滑線的字母即可組成完整的指令集,比如slt意思是set less than,相當于是一種縮寫,完整語句方便我們快速清晰的理解指令的作用。
在這里插入圖片描述
上圖可以表示:slt、slti、sltu、sltiu 這4條RVI指令。

下面將列舉以下RISC-V指令集:

  • RVI(包括RV32I與RV64I)
  • RVM(包括RV32M與RV64M)
  • RVFD(包括RV32FD與RV64FD)
  • RVA(包括RV32A與RV64A)

3 RVI指令集

RVI是 RISC-V 指令集架構的基礎部分,它定義了32位整數運算的核心指令集。RVI 包括 RV32I(32位整數指令集)和 RV64I(64位整數指令集),它們為處理器提供了執行基本計算任務的能力;包括:內存操作指令、邏輯指令、分支和跳轉指令、算術指令等等,下面就一一列舉。

3.1 內存操作指令

在RISC-V中,內存操作主要通過加載(Load)和存儲(Store)兩類指令來實現。這些指令允許程序從內存讀取數據到寄存器(Load),或將寄存器中的數據寫入內存(Store)
在這里插入圖片描述

指令格式功能描述操作(偽代碼)指令集
LBlb rd, offset(rs1)加載字節(符號擴展)rd = SignExt(Mem[rs1 + offset][7:0])RV32I / RV64I
LBUlbu rd, offset(rs1)加載字節(無符號擴展)rd = ZeroExt(Mem[rs1 + offset][7:0])RV32I / RV64I
LHlh rd, offset(rs1)加載半字(符號擴展)rd = SignExt(Mem[rs1 + offset][15:0])RV32I / RV64I
LHUlhu rd, offset(rs1)加載半字(無符號擴展)rd = ZeroExt(Mem[rs1 + offset][15:0])RV32I / RV64I
LWlw rd, offset(rs1)加載字(RV32I:32位;RV64I:符號擴展至64位)RV32I: rd = Mem[rs1 + offset][31:0]
RV64I: rd = SignExt(Mem[rs1 + offset][31:0])
RV32I / RV64I
LWUlwu rd, offset(rs1)加載字(無符號擴展至64位)rd = ZeroExt(Mem[rs1 + offset][31:0])RV64I
LDld rd, offset(rs1)加載雙字(64位)rd = Mem[rs1 + offset][63:0]RV64I
SBsb rs2, offset(rs1)存儲字節Mem[rs1 + offset] = rs2[7:0]RV32I / RV64I
SHsh rs2, offset(rs1)存儲半字Mem[rs1 + offset] = rs2[15:0]RV32I / RV64I
SWsw rs2, offset(rs1)存儲字Mem[rs1 + offset] = rs2[31:0]RV32I / RV64I
SDsd rs2, offset(rs1)存儲雙字Mem[rs1 + offset] = rs2[63:0]RV64I

3.2 算術指令

算術指令狹義定義:僅包含加法、減法及其直接相關的操作,用于寄存器或寄存器與立即數之間的數值運算。
在這里插入圖片描述

指令格式功能描述操作(偽代碼)指令集
基礎加減指令
ADDadd rd, rs1, rs2加法(忽略溢出)rd = rs1 + rs2RV32I / RV64I
SUBsub rd, rs1, rs2減法(忽略溢出)rd = rs1 - rs2RV32I / RV64I
ADDIaddi rd, rs1, imm立即數加法(符號擴展立即數)rd = rs1 + SignExt(imm)RV32I / RV64I
RV64I 擴展加減指令
ADDIWaddiw rd, rs1, imm立即數加法(32位,符號擴展至64位)rd = SignExt((rs1 + SignExt(imm))[31:0])RV64I
ADDWaddw rd, rs1, rs2加法(32位,符號擴展至64位)rd = SignExt((rs1 + rs2)[31:0])RV64I
SUBWsubw rd, rs1, rs2減法(32位,符號擴展至64位)rd = SignExt((rs1 - rs2)[31:0])RV64I
高位立即數構建指令
LUIlui rd, imm加載高位立即數(imm[31:12])rd = imm << 12RV32I / RV64I
AUIPCauipc rd, imm將高位立即數與 PC 相加rd = PC + (imm << 12)RV32I / RV64I

偽指令表格

偽指令格式功能描述實際轉換(基礎指令)適用指令集
寄存器操作
MVmv rd, rs寄存器間移動值addi rd, rs, 0RV32I / RV64I
NEGneg rd, rs取負值(rd = -rs)sub rd, x0, rsRV32I / RV64I
NEGWnegw rd, rs取負值(32位操作,符號擴展)subw rd, x0, rsRV64I
立即數操作
LIli rd, imm加載任意立即數到寄存器若 imm 在 12 位有符號范圍內:addi rd, x0, imm
否則:lui rd, imm[31:12] + addi rd, rd, imm[11:0]
RV32I / RV64I
地址加載
LAla rd, symbol加載絕對地址(鏈接時解析)auipc rd, offset_hi + addi rd, rd, offset_lo
lui rd, offset_hi + addi rd, rd, offset_lo
RV32I / RV64I
LLAlla rd, symbol加載本地地址(PC相對,位置無關)auipc rd, offset_hi + addi rd, rd, offset_loRV32I / RV64I
符號擴展
SEXT.Wsext.w rd, rs將低32位符號擴展至64位(RV64I)addiw rd, rs, 0RV64I
空操作
NOPnop空操作(無實際效果)addi x0, x0, 0RV32I / RV64I

3.3 移位指令

移位指令用于對寄存器中的數據進行位級左移或右移,分為以下兩類:

    1. 寄存器移位:移位位數由另一個寄存器的低 5 位(RV32I)或低 6 位(RV64I)指定。
    1. 立即數移位:移位位數由指令中的立即數字段直接指定。
      在這里插入圖片描述
指令格式功能描述操作(偽代碼)指令集
邏輯左移
SLLsll rd, rs1, rs2邏輯左移(低位補零)rd = rs1 << (rs2[4:0])(RV32I,取低5位)
rd = rs1 << (rs2[5:0])(RV64I,取低6位)
RV32I / RV64I
SLLIslli rd, rs1, shamt立即數邏輯左移rd = rs1 << shamt(shamt范圍:RV32I為 0–31,RV64I為 0–63)RV32I / RV64I
SLLWsllw rd, rs1, rs232位邏輯左移(RV64I,低32位操作)rd = SignExt((rs1[31:0] << rs2[4:0]))RV64I
SLLIWslliw rd, rs1, shamt32位立即數邏輯左移(RV64I)rd = SignExt((rs1[31:0] << shamt)[31:0])(shamt范圍:0–31)RV64I
邏輯右移
SRLsrl rd, rs1, rs2邏輯右移(高位補零)rd = rs1 >> (rs2[4:0])(RV32I)
rd = rs1 >> (rs2[5:0])(RV64I)
RV32I / RV64I
SRLIsrli rd, rs1, shamt立即數邏輯右移rd = rs1 >> shamtRV32I / RV64I
SRLWsrlw rd, rs1, rs232位邏輯右移(RV64I,低32位操作)rd = SignExt((rs1[31:0] >> rs2[4:0]))RV64I
SRLIWsrliw rd, rs1, shamt32位立即數邏輯右移(RV64I)rd = SignExt((rs1[31:0] >> shamt)[31:0])(shamt范圍:0–31)RV64I
算術右移
SRAsra rd, rs1, rs2算術右移(高位補符號位)rd = rs1 >>> (rs2[4:0])(RV32I)
rd = rs1 >>> (rs2[5:0])(RV64I)
RV32I / RV64I
SRAIsrai rd, rs1, shamt立即數算術右移rd = rs1 >>> shamtRV32I / RV64I
SRAWsraw rd, rs1, rs232位算術右移(RV64I,低32位操作)rd = SignExt((rs1[31:0] >>> rs2[4:0]))RV64I
SRAIWsraiw rd, rs1, shamt32位立即數算術右移(RV64I)rd = SignExt((rs1[31:0] >>> shamt)[31:0])(shamt范圍:0–31)RV64I

3.4 邏輯指令

邏輯指令用于對寄存器中的數據進行按位操作,分為以下兩類:

  • 1.寄存器-寄存器操作:兩個寄存器之間的按位運算。
  • 2.寄存器-立即數操作:寄存器與符號擴展后的立即數進行按位運算。
    在這里插入圖片描述
指令格式功能描述操作(偽代碼)指令集
按位與操作
ANDand rd, rs1, rs2按位與rd = rs1 & rs2RV32I / RV64Ity-reference
ANDIandi rd, rs1, imm立即數按位與(符號擴展立即數)rd = rs1 & SignExt(imm)RV32I / RV64Ity-reference
按位或操作
ORor rd, rs1, rs2按位或`rd = rs1rs2`
ORIori rd, rs1, imm立即數按位或(符號擴展立即數)`rd = rs1SignExt(imm)`
按位異或操作
XORxor rd, rs1, rs2按位異或rd = rs1 ^ rs2RV32I / RV64Ity-reference
XORIxori rd, rs1, imm立即數按位異或(符號擴展立即數)rd = rs1 ^ SignExt(imm)RV32I / RV64Ity-reference

偽指令

偽指令格式功能描述實際轉換(基礎指令)適用指令集
NOTnot rd, rs按位取反(rd = ~rs)xori rd, rs, -1RV32I / RV64I

3.5 比較-置位指令

指令根據兩個操作數的比較結果設置目標寄存器的值為 1 或 0,用于條件判斷和邏輯控制,支持有符號和無符號比較。

在這里插入圖片描述

指令格式功能描述操作(偽代碼)指令集
有符號比較
SLTslt rd, rs1, rs2有符號比較:若 rs1 < rs2,則 rd = 1,否則 rd = 0rd = (rs1 < rs2) ? 1 : 0 (有符號比較)RV32I / RV64Ity-reference
SLTIslti rd, rs1, imm有符號立即數比較:若 rs1 < SignExt(imm),則 rd = 1rd = (rs1 < SignExt(imm)) ? 1 : 0RV32I / RV64Ity-reference
無符號比較
SLTUsltu rd, rs1, rs2無符號比較:若 rs1 < rs2,則 rd = 1rd = (rs1 < rs2) ? 1 : 0 (無符號比較)RV32I / RV64Ity-reference
SLTIUsltiu rd, rs1, imm無符號立即數比較(立即數符號擴展后按無符號比較):若 rs1 < SignExt(imm),則 rd = 1rd = (rs1 < SignExt(imm)) ? 1 : 0 (無符號比較)RV32I / RV64Ity-reference

偽指令

偽指令格式功能描述實際轉換(基礎指令)適用指令集
零值判斷
SEQZseqz rd, rs若 rs == 0,則 rd = 1,否則 0sltiu rd, rs, 1RV32I / RV64I
SNEZsnez rd, rs若 rs ≠ 0,則 rd = 1,否則 0sltu rd, x0, rsRV32I / RV64I
符號判斷
SLTZsltz rd, rs若 rs < 0(有符號),則 rd = 1slt rd, rs, x0RV32I / RV64I
SGTZsgtz rd, rs若 rs > 0(有符號),則 rd = 1slt rd, x0, rsRV32I / RV64I
非零符號判斷
SLEZslez rd, rs若 rs ≤ 0(有符號),則 rd = 1slt rd, x0, rs → xori rd, rd, 1RV32I / RV64I
SGEZsgez rd, rs若 rs ≥ 0(有符號),則 rd = 1slt rd, rs, x0 → xori rd, rd, 1RV32I / RV64I

3.6 分支指令

分支指令用于控制程序流程,根據條件或地址跳轉執行目標代碼,均為 B-Type 或 J-Type 格式。
在這里插入圖片描述

條件分支指令

指令格式功能描述操作(偽代碼)指令集
BEQbeq rs1, rs2, offset若 rs1 == rs2,跳轉到 PC + offsetif (rs1 == rs2) PC += SignExt(offset << 1)RV32I / RV64I
BNEbne rs1, rs2, offset若 rs1 ≠ rs2,跳轉到 PC + offsetif (rs1 != rs2) PC += SignExt(offset << 1)RV32I / RV64I
BLTblt rs1, rs2, offset若 rs1 < rs2(有符號),跳轉if (rs1 < rs2) PC += SignExt(offset << 1)RV32I / RV64I
BGEbge rs1, rs2, offset若 rs1 ≥ rs2(有符號),跳轉if (rs1 >= rs2) PC += SignExt(offset << 1)RV32I / RV64I
BLTUbltu rs1, rs2, offset若 rs1 < rs2(無符號),跳轉if (rs1 < rs2) PC += SignExt(offset << 1)RV32I / RV64I
BGEUbgeu rs1, rs2, offset若 rs1 ≥ rs2(無符號),跳轉if (rs1 >= rs2) PC += SignExt(offset << 1)RV32I / RV64I

條件分支偽指令

偽指令格式功能描述實際轉換(基礎指令)適用指令集
BEQZbeqz rs, offset若 rs == 0,跳轉到 offsetbeq rs, x0, offsetRV32I / RV64I
BNEZbnez rs, offset若 rs ≠ 0,跳轉到 offsetbne rs, x0, offsetRV32I / RV64I
BGTbgt rs1, rs2, offset若 rs1 > rs2(有符號),跳轉blt rs2, rs1, offsetRV32I / RV64I
BGTUbgtu rs1, rs2, offset若 rs1 > rs2(無符號),跳轉bltu rs2, rs1, offsetRV32I / RV64I
BLEble rs1, rs2, offset若 rs1 ≤ rs2(有符號),跳轉bge rs2, rs1, offsetRV32I / RV64I
BLEUbleu rs1, rs2, offset若 rs1 ≤ rs2(無符號),跳轉bgeu rs2, rs1, offsetRV32I / RV64I

3.7 跳轉指令

跳轉指令用于改變程序的執行流程,使程序能夠跳轉到代碼中的其他位置執行
在這里插入圖片描述

無條件跳轉指令

指令格式功能描述操作(偽代碼)指令集
JALjal rd, offset跳轉到 PC + offset,并將返回地址存入 rdrd = PC + 4; PC += SignExt(offset << 1)RV32I / RV64I
JALRjalr rd, offset(rs1)跳轉到 rs1 + offset,存入返回地址rd = PC + 4; PC = (rs1 + SignExt(offset)) & ~1RV32I / RV64I

無條件跳轉偽指令

偽指令格式功能描述實際轉換(基礎指令)適用指令集
Jj offset無條件跳轉到 offsetjal x0, offsetRV32I / RV64I
JRjr rs跳轉到 rs 指向的地址jalr x0, 0(rs)RV32I / RV64I
RETret從函數返回(跳轉到 ra 地址)jalr x0, 0(ra)RV32I / RV64I

3.8 同步指令

同步指令用于處理內存訪問順序控制,確保數據一致性和并發安全。

內存屏障指令

指令格式功能描述操作(偽代碼)適用指令集
FENCEfence pred, succ內存屏障(控制訪存順序)確保 pred 操作在 succ 操作前完成 (pred/succ 可以為 r(讀)、w(寫)、i(指令流))RV32I / RV64I
FENCE.Ifence.i指令流同步屏障確保后續指令看到此前所有指令的修改(用于自修改代碼)RV32I / RV64I)

3.9 環境指令

環境指令用于系統調用、調試、中斷處理等特權級操作,通常需在特定權限模式下執行。

系統調用與異常處理指令

指令格式功能描述操作(偽代碼)適用指令集
ECALLecall觸發環境調用(系統調用/異常)根據當前模式跳轉到異常處理程序RV32I / RV64I
EBREAKebreak觸發斷點異常(用于調試)進入調試模式或觸發異常處理RV32I / RV64I

中斷返回指令

指令格式功能描述操作(偽代碼)適用指令集
MRETmret從機器模式異常返回PC = MEPC; Privilege = MPPRV32I / RV64I
SRETsret從監管者模式異常返回PC = SEPC; Privilege = SPPRV32I / RV64I
URETuret從用戶模式異常返回PC = UEPCRV32I / RV64I

等待與暫停指令

指令格式功能描述操作(偽代碼)適用指令集
WFIwfi等待中斷(暫停執行直至中斷發生)暫停 CPU 直至中斷或事件喚醒RV32I / RV64I )

3.10 控制狀態寄存器指令

指令用于讀寫處理器的控制狀態寄存器(如中斷配置、計數器、特權模式設置等),支持原子操作和位操作,適用于系統編程和特權級管理。
在這里插入圖片描述

CSR 讀寫指令

指令格式功能描述操作(偽代碼)適用指令集
CSRRWcsrrw rd, csr, rs1rs1 寫入 CSR,原值存入 rdt = CSR[csr]; CSR[csr] = rs1; rd = tRV32I / RV64I
CSRRScsrrs rd, csr, rs1rs1 對應位設為 1,原值存入 rd`t = CSR[csr]; CSR[csr]= rs1; rd = t`
CSRRCcsrrc rd, csr, rs1rs1 對應位清 0,原值存入 rdt = CSR[csr]; CSR[csr] &= ~rs1; rd = tRV32I / RV64I
CSRRWIcsrrwi rd, csr, imm將 5 位立即數寫入 CSRt = CSR[csr]; CSR[csr] = imm; rd = tRV32I / RV64I
CSRRSIcsrrsi rd, csr, imm將立即數對應位置 1`t = CSR[csr]; CSR[csr]= imm; rd = t`
CSRRCIcsrrci rd, csr, imm將立即數對應位清 0t = CSR[csr]; CSR[csr] &= ~imm; rd = tRV32I / RV64I

CSR 偽指令

偽指令格式功能描述實際轉換(基礎指令)適用指令集
CSRRcsrr rd, csr讀取 CSR 的值到寄存器csrrs rd, csr, x0(讀 CSR,不修改)RV32I / RV64I
CSRWcsrw csr, rs將寄存器的值寫入 CSRcsrrw x0, csr, rs(丟棄原值,僅寫入)RV32I / RV64I
CSRScsrs csr, rs設置 CSR 中由 rs 指定的位csrrs x0, csr, rs(按位或,不保存結果)RV32I / RV64I
CSRCcsrc csr, rs清除 CSR 中由 rs 指定的位csrrc x0, csr, rs(按位與取反,不保存結果)RV32I / RV64I
CSRWIcsrwi csr, imm將 5 位立即數寫入 CSRcsrrwi x0, csr, immRV32I / RV64I
CSRSIcsrsi csr, imm設置 CSR 中由立即數指定的位csrrsi x0, csr, immRV32I / RV64I
CSRCIcsrci csr, imm清除 CSR 中由立即數指定的位csrrci x0, csr, immRV32I / RV64I

4 RVM指令集

RVM 擴展指令分為 乘法指令 和 除法/取余指令,支持有符號和無符號操作,并區分 RV32 和 RV64 的差異。
在這里插入圖片描述

乘法指令

指令格式功能描述操作(偽代碼)適用指令集
MULmul rd, rs1, rs2乘法(低32/64位結果)rd = (rs1 * rs2)[31:0](RV32)
rd = rs1 * rs2(RV64)
RV32M / RV64M
MULHmulh rd, rs1, rs2有符號乘法(高32/64位結果)rd = (rs1 * rs2)[63:32](RV32)
rd = (rs1 * rs2)[127:64](RV64)
RV32M / RV64M
MULHUmulhu rd, rs1, rs2無符號乘法(高32/64位結果)同上,操作數為無符號數RV32M / RV64M
MULHSUmulhsu rd, rs1, rs2有符號-無符號乘法(高32/64位結果)rs1 有符號,rs2 無符號RV32M / RV64M
MULWmulw rd, rs1, rs232位乘法(結果符號擴展至64位)rd = SignExt((rs1[31:0] * rs2[31:0]))RV64M

除法/取余指令

指令格式功能描述操作(偽代碼)適用指令集
DIVdiv rd, rs1, rs2有符號除法(商)rd = rs1 / rs2(向零舍入)RV32M / RV64M
DIVUdivu rd, rs1, rs2無符號除法(商)rd = rs1 / rs2RV32M / RV64M
REMrem rd, rs1, rs2有符號取余(余數)rd = rs1 % rs2(符號與 rs1 相同)RV32M / RV64M
REMUremu rd, rs1, rs2無符號取余(余數)rd = rs1 % rs2RV32M / RV64M
DIVWdivw rd, rs1, rs232位有符號除法(符號擴展至64位)rd = SignExt((rs1[31:0] / rs2[31:0]))RV64M
DIVUWdivuw rd, rs1, rs232位無符號除法(零擴展至64位)rd = ZeroExt((rs1[31:0] / rs2[31:0]))RV64M
REMWremw rd, rs1, rs232位有符號取余(符號擴展至64位)rd = SignExt((rs1[31:0] % rs2[31:0]))RV64M
REMUWremuw rd, rs1, rs232位無符號取余(零擴展至64位)rd = ZeroExt((rs1[31:0] % rs2[31:0]))RV64M

5 RVFD指令集

5.1 訪存指令

指令用于在內存和浮點寄存器(f0-f31)之間傳輸單精度(F 擴展)或雙精度(D 擴展)浮點數據:
在這里插入圖片描述

浮點加載和存儲指令

指令格式功能描述操作(偽代碼)適用指令集
FLWflw fd, offset(rs1)從內存加載單精度浮點數到浮點寄存器fd = F32(Mem[rs1 + offset])RV32F / RV64F
FSWfsw fs, offset(rs1)將單精度浮點數從浮點寄存器存入內存Mem[rs1 + offset] = F32(fs)RV32F / RV64F
FLDfld fd, offset(rs1)從內存加載雙精度浮點數到浮點寄存器fd = F64(Mem[rs1 + offset])RV64D
FSDfsd fs, offset(rs1)將雙精度浮點數從浮點寄存器存入內存Mem[rs1 + offset] = F64(fs)RV64D

5.2 算術指令

算術指令用于執行各種數學運算,如加法、減法、乘法、除法等。當涉及到浮點數時,這些操作變得更為復雜,因為它們需要處理指數和尾數部分

在這里插入圖片描述

基本算術指令

指令類型指令格式功能描述操作(偽代碼)適用指令集
加法FADD.Sfadd.s fd, fs1, fs2單精度浮點加法fd = fs1 + fs2RV32F / RV64F
FADD.Dfadd.d fd, fs1, fs2雙精度浮點加法fd = fs1 + fs2RV64D
減法FSUB.Sfsub.s fd, fs1, fs2單精度浮點減法fd = fs1 - fs2RV32F / RV64F
FSUB.Dfsub.d fd, fs1, fs2雙精度浮點減法fd = fs1 - fs2RV64D
乘法FMUL.Sfmul.s fd, fs1, fs2單精度浮點乘法fd = fs1 * fs2RV32F / RV64F
FMUL.Dfmul.d fd, fs1, fs2雙精度浮點乘法fd = fs1 * fs2RV64D
除法FDIV.Sfdiv.s fd, fs1, fs2單精度浮點除法fd = fs1 / fs2RV32F / RV64F
FDIV.Dfdiv.d fd, fs1, fs2雙精度浮點除法fd = fs1 / fs2RV64D
平方根FSQRT.Sfsqrt.s fd, fs1單精度浮點平方根fd = sqrt(fs1)RV32F / RV64F
FSQRT.Dfsqrt.d fd, fs1雙精度浮點平方根fd = sqrt(fs1)RV64D
最小值FMIN.Sfmin.s fd, fs1, fs2單精度浮點最小值fd = min(fs1, fs2)RV32F / RV64F
FMIN.Dfmin.d fd, fs1, fs2雙精度浮點最小值fd = min(fs1, fs2)RV64D
最大值FMAX.Sfmax.s fd, fs1, fs2單精度浮點最大值fd = max(fs1, fs2)RV32F / RV64F
FMAX.Dfmax.d fd, fs1, fs2雙精度浮點最大值fd = max(fs1, fs2)RV64D

5.3 RVFD 乘加指令

指令用于執行 乘加融合運算(Fused Multiply-Add, FMA),即在一個操作中完成乘法和加法,通常具有更高的精度和性能
在這里插入圖片描述

指令類型指令格式功能描述操作(偽代碼)適用指令集
單精度乘加FMADD.Sfmadd.s fd, fs1, fs2, fs3單精度浮點乘加fd = (fs1 * fs2) + fs3RV32F / RV64F
單精度乘減FMSUB.Sfmsub.s fd, fs1, fs2, fs3單精度浮點乘減fd = (fs1 * fs2) - fs3RV32F / RV64F
單精度負乘加FNMADD.Sfnmadd.s fd, fs1, fs2, fs3單精度浮點負乘加fd = -((fs1 * fs2) + fs3)RV32F / RV64F
單精度負乘減FNMSUB.Sfnmsub.s fd, fs1, fs2, fs3單精度浮點負乘減fd = -((fs1 * fs2) - fs3)RV32F / RV64F
雙精度乘加FMADD.Dfmadd.d fd, fs1, fs2, fs3雙精度浮點乘加fd = (fs1 * fs2) + fs3RV64D
雙精度乘減FMSUB.Dfmsub.d fd, fs1, fs2, fs3雙精度浮點乘減fd = (fs1 * fs2) - fs3RV64D
雙精度負乘加FNMADD.Dfnmadd.d fd, fs1, fs2, fs3雙精度浮點負乘加fd = -((fs1 * fs2) + fs3)RV64D
雙精度負乘減FNMSUB.Dfnmsub.d fd, fs1, fs2, fs3雙精度浮點負乘減fd = -((fs1 * fs2) - fs3)RV64D

5.4 RVFD傳送指令

指令用于在 浮點寄存器 和 整數寄存器 之間傳輸數據,或在不同浮點寄存器之間復制數據
在這里插入圖片描述

指令類型指令格式功能描述操作(偽代碼)適用指令集
浮點到整數FMV.X.Sfmv.x.s rd, fs1將單精度浮點數轉為整數表示rd = fs1(按位復制)RV32F / RV64F
浮點到整數FMV.X.Dfmv.x.d rd, fs1將雙精度浮點數轉為整數表示rd = fs1(按位復制)RV64D
整數到浮點FMV.S.Xfmv.s.x fd, rs1將整數表示轉為單精度浮點數fd = rs1(按位復制)RV32F / RV64F
整數到浮點FMV.D.Xfmv.d.x fd, rs1將整數表示轉為雙精度浮點數fd = rs1(按位復制)RV64D

5.5 RVFD 轉換指令

分兩類歸納:浮點寄存器間傳送 和 浮點與整數寄存器間傳送,涵蓋符號操作、位模式復制及特殊值處理
在這里插入圖片描述

浮點與整數之間的轉換

指令類型指令格式功能描述操作(偽代碼)適用指令集
浮點 → 整數FCVT.W.Sfcvt.w.s rd, fs1單精度浮點轉為 32 位有符號整數rd = (int32_t)fs1RV32F / RV64F
FCVT.WU.Sfcvt.wu.s rd, fs1單精度浮點轉為 32 位無符號整數rd = (uint32_t)fs1RV32F / RV64F
FCVT.L.Sfcvt.l.s rd, fs1單精度浮點轉為 64 位有符號整數rd = (int64_t)fs1RV64F
FCVT.LU.Sfcvt.lu.s rd, fs1單精度浮點轉為 64 位無符號整數rd = (uint64_t)fs1RV64F
FCVT.W.Dfcvt.w.d rd, fs1雙精度浮點轉為 32 位有符號整數rd = (int32_t)fs1RV64D
FCVT.WU.Dfcvt.wu.d rd, fs1雙精度浮點轉為 32 位無符號整數rd = (uint32_t)fs1RV64D
FCVT.L.Dfcvt.l.d rd, fs1雙精度浮點轉為 64 位有符號整數rd = (int64_t)fs1RV64D
FCVT.LU.Dfcvt.lu.d rd, fs1雙精度浮點轉為 64 位無符號整數rd = (uint64_t)fs1RV64D
整數 → 浮點FCVT.S.Wfcvt.s.w fd, rs132 位有符號整數轉為單精度浮點fd = (float)rs1RV32F / RV64F
FCVT.S.WUfcvt.s.wu fd, rs132 位無符號整數轉為單精度浮點fd = (float)rs1RV32F / RV64F
FCVT.S.Lfcvt.s.l fd, rs164 位有符號整數轉為單精度浮點fd = (float)rs1RV64F
FCVT.S.LUfcvt.s.lu fd, rs164 位無符號整數轉為單精度浮點fd = (float)rs1RV64F
FCVT.D.Wfcvt.d.w fd, rs132 位有符號整數轉為雙精度浮點fd = (double)rs1RV64D
FCVT.D.WUfcvt.d.wu fd, rs132 位無符號整數轉為雙精度浮點fd = (double)rs1RV64D
FCVT.D.Lfcvt.d.l fd, rs164 位有符號整數轉為雙精度浮點fd = (double)rs1RV64D
FCVT.D.LUfcvt.d.lu fd, rs164 位無符號整數轉為雙精度浮點fd = (double)rs1RV64D

浮點精度之間的轉換

指令類型指令格式功能描述操作(偽代碼)適用指令集
單精度 ? 雙精度FCVT.S.Dfcvt.s.d fd, fs1雙精度浮點轉為單精度浮點fd = (float)fs1RV64D
單精度 ? 雙精度FCVT.D.Sfcvt.d.s fd, fs1單精度浮點轉為雙精度浮點fd = (double)fs1RV64D

5.6 RVFD 符號注入指令

指令用于將 整數立即數 或 整數寄存器值 注入到浮點寄存器中,通常用于快速構造浮點常數或特殊值(如 NaN、無窮大)
在這里插入圖片描述

單精度浮點注入指令

指令類型指令格式功能描述操作(偽代碼)適用指令集
符號復制FSGNJ.Sfsgnj.s fd, fs1, fs2復制數值,符號位取自 fs2fd = {fs2[31], fs1[30:0]}RV32F / RV64F
符號取反FSGNJN.Sfsgnjn.s fd, fs1, fs2復制數值,符號位取反自 fs2fd = {~fs2[31], fs1[30:0]}RV32F / RV64F
符號取絕對值FSGNJX.Sfsgnjx.s fd, fs1, fs2復制數值,符號位異或(取絕對值)fd = {fs1[31] ^ fs2[31], fs1[30:0]}RV32F / RV64F

雙精度浮點注入指令

指令類型指令格式功能描述操作(偽代碼)適用指令集
符號復制FSGNJ.Dfsgnj.d fd, fs1, fs2復制數值,符號位取自 fs2fd = {fs2[63], fs1[62:0]}RV64D
符號取反FSGNJN.Dfsgnjn.d fd, fs1, fs2復制數值,符號位取反自 fs2fd = {~fs2[63], fs1[62:0]}RV64D
符號取絕對值FSGNJX.Dfsgnjx.d fd, fs1, fs2復制數值,符號位異或(取絕對值)fd = {fs1[63] ^ fs2[63], fs1[62:0]}RV64D

偽指令

指令類型偽指令格式功能描述實際轉換(基礎指令)適用指令集
單精度浮點注入FABS.Sfabs.s fd, fs單精度浮點取絕對值fsgnjx.s fd, fs, fsRV32F / RV64F
FMV.Sfmv.s fd, fs單精度浮點復制fsgnj.s fd, fs, fsRV32F / RV64F
FNEG.Sfneg.s fd, fs單精度浮點取反fsgnjn.s fd, fs, fsRV32F / RV64F
指令類型偽指令格式功能描述實際轉換(基礎指令)適用指令集
雙精度浮點注入FABS.Dfabs.d fd, fs雙精度浮點取絕對值fsgnjx.d fd, fs, fsRV64D
FMV.Dfmv.d fd, fs雙精度浮點復制fsgnj.d fd, fs, fsRV64D
FNEG.Dfneg.d fd, fs雙精度浮點取反fsgnjn.d fd, fs, fsRV64D

5.7 RVFD 比較指令

指令用于比較兩個浮點數的值,并將比較結果寫入整數寄存器,支持 相等、小于 和 小于等于 三種比較操作
在這里插入圖片描述

指令類型指令格式功能描述操作(偽代碼)適用指令集
相等比較FEQ.Sfeq.s rd, fs1, fs2單精度浮點相等比較rd = (fs1 == fs2) ? 1 : 0RV32F / RV64F
FEQ.Dfeq.d rd, fs1, fs2雙精度浮點相等比較rd = (fs1 == fs2) ? 1 : 0RV64D
小于比較FLT.Sflt.s rd, fs1, fs2單精度浮點小于比較rd = (fs1 < fs2) ? 1 : 0RV32F / RV64F
FLT.Dflt.d rd, fs1, fs2雙精度浮點小于比較rd = (fs1 < fs2) ? 1 : 0RV64D
小于等于比較FLE.Sfle.s rd, fs1, fs2單精度浮點小于等于比較rd = (fs1 <= fs2) ? 1 : 0RV32F / RV64F
FLE.Dfle.d rd, fs1, fs2雙精度浮點小于等于比較rd = (fs1 <= fs2) ? 1 : 0RV64D

5.8 RVFD 分類指令

指令用于檢查浮點數的類別(如正無窮、負零、NaN 等),并將結果寫入整數寄存器,適用于浮點數的異常處理和特殊值檢測
在這里插入圖片描述

指令類型指令格式功能描述操作(偽代碼)適用指令集
浮點分類單精度分類fclass.s rd, fs1單精度浮點分類rd = classify(fs1)RV32F / RV64F
浮點分類雙精度分類fclass.d rd, fs1雙精度浮點分類rd = classify(fs1)RV64D

5.9 RVFD 配置指令

指令用于配置和管理浮點單元的狀態,包括 舍入模式、異常標志 和 浮點控制狀態寄存器(fcsr) 的操作

指令類型指令格式功能描述操作(偽代碼)適用指令集
浮點控制狀態寄存器(fcsr)操作
讀取 fcsrFRCSRfrcsr rd讀取 fcsr 的值到整數寄存器rd = fcsrRV32F / RV64F
寫入 fcsrFSCSRfscsr rd, rs將整數寄存器的值寫入 fcsrfcsr = rsRV32F / RV64F
交換 fcsrFSRCSfscsr rd, rs交換 fcsr 和整數寄存器的值t = fcsr; fcsr = rs; rd = tRV32F / RV64F
舍入模式配置
讀取舍入模式FRRMfrrm rd讀取舍入模式到整數寄存器rd = fcsr[7:5]RV32F / RV64F
寫入舍入模式FSRMfsrm rd, rs將整數寄存器的值寫入舍入模式fcsr[7:5] = rs[2:0]RV32F / RV64F
交換舍入模式FSRRMfsrrm rd, rs交換舍入模式和整數寄存器的值t = fcsr[7:5]; fcsr[7:5] = rs[2:0]; rd = tRV32F / RV64F
異常標志操作
讀取異常標志FFLAGSfflags rd讀取異常標志到整數寄存器rd = fcsr[4:0]RV32F / RV64F
寫入異常標志FSFLAGSfsflags rd, rs將整數寄存器的值寫入異常標志fcsr[4:0] = rs[4:0]RV32F / RV64F
交換異常標志FSRFLAGSfsrflags rd, rs交換異常標志和整數寄存器的值t = fcsr[4:0]; fcsr[4:0] = rs[4:0]; rd = tRV32F / RV64F

6 RVA指令集

RVA(Atomic Operations)擴展為 RISC-V 提供了硬件支持的原子操作指令,用于在多線程或多核環境中實現 原子內存訪問 和 同步操作,確保數據一致性和并發安全。
在這里插入圖片描述

加載保留與條件存儲指令

指令類型指令格式功能描述操作(偽代碼)適用指令集
加載保留LR.Wlr.w rd, (rs1)加載保留(原子加載字,標記內存地址)rd = Mem[rs1]; Reserve rs1RV32A / RV64A
LR.Dlr.d rd, (rs1)加載保留(原子加載雙字)rd = Mem[rs1]; Reserve rs1RV64A
條件存儲SC.Wsc.w rd, rs2, (rs1)條件存儲(若地址未被修改,存儲字)if (Reserve rs1 still valid) { Mem[rs1] = rs2; rd = 0 } else { rd = 1 }RV32A / RV64A
SC.Dsc.d rd, rs2, (rs1)條件存儲(若地址未被修改,存儲雙字)if (Reserve rs1 still valid) { Mem[rs1] = rs2; rd = 0 } else { rd = 1 }RV64A

原子內存操作指令

指令類型指令格式功能描述操作(偽代碼)適用指令集
原子加AMOADD.Wamoadd.w rd, rs2, (rs1)原子加并返回原值rd = Mem[rs1]; Mem[rs1] += rs2RV32A / RV64A
AMOADD.Damoadd.d rd, rs2, (rs1)原子加并返回原值(雙字)rd = Mem[rs1]; Mem[rs1] += rs2RV64A
原子交換AMOSWAP.Wamoswap.w rd, rs2, (rs1)原子交換并返回原值rd = Mem[rs1]; Mem[rs1] = rs2RV32A / RV64A
AMOSWAP.Damoswap.d rd, rs2, (rs1)原子交換并返回原值(雙字)rd = Mem[rs1]; Mem[rs1] = rs2RV64A
原子按位與AMOAND.Wamoand.w rd, rs2, (rs1)原子按位與并返回原值rd = Mem[rs1]; Mem[rs1] &= rs2RV32A / RV64A
AMOAND.Damoand.d rd, rs2, (rs1)原子按位與并返回原值(雙字)rd = Mem[rs1]; Mem[rs1] &= rs2RV64A
原子按位或AMOOR.Wamoor.w rd, rs2, (rs1)原子按位或并返回原值`rd = Mem[rs1]; Mem[rs1]= rs2`
AMOOR.Damoor.d rd, rs2, (rs1)原子按位或并返回原值(雙字)`rd = Mem[rs1]; Mem[rs1]= rs2`
原子按位異或AMOXOR.Wamoxor.w rd, rs2, (rs1)原子按位異或并返回原值rd = Mem[rs1]; Mem[rs1] ^= rs2RV32A / RV64A
AMOXOR.Damoxor.d rd, rs2, (rs1)原子按位異或并返回原值(雙字)rd = Mem[rs1]; Mem[rs1] ^= rs2RV64A
原子最大值AMOMAX.Wamomax.w rd, rs2, (rs1)原子有符號最大值并返回原值rd = Mem[rs1]; Mem[rs1] = max(rd, rs2)RV32A / RV64A
AMOMAX.Damomax.d rd, rs2, (rs1)原子有符號最大值并返回原值(雙字)rd = Mem[rs1]; Mem[rs1] = max(rd, rs2)RV64A
原子無符號最大值AMOMAXU.Wamomaxu.w rd, rs2, (rs1)原子無符號最大值并返回原值rd = Mem[rs1]; Mem[rs1] = maxu(rd, rs2)RV32A / RV64A
AMOMAXU.Damomaxu.d rd, rs2, (rs1)原子無符號最大值并返回原值(雙字)rd = Mem[rs1]; Mem[rs1] = maxu(rd, rs2)RV64A
原子最小值AMOMIN.Wamomin.w rd, rs2, (rs1)原子有符號最小值并返回原值rd = Mem[rs1]; Mem[rs1] = min(rd, rs2)RV32A / RV64A
AMOMIN.Damomin.d rd, rs2, (rs1)原子有符號最小值并返回原值(雙字)rd = Mem[rs1]; Mem[rs1] = min(rd, rs2)RV64A
原子無符號最小值AMOMINU.Wamominu.w rd, rs2, (rs1)原子無符號最小值并返回原值rd = Mem[rs1]; Mem[rs1] = minu(rd, rs2)RV32A / RV64A
AMOMINU.Damominu.d rd, rs2, (rs1)原子無符號最小值并返回原值(雙字)rd = Mem[rs1]; Mem[rs1] = minu(rd, rs2)RV64A

上面列舉了RISC-V指令集,但實際上上面列舉的指令集我很多也沒用過,是按照spec總結了下,如有錯誤或者遺漏,還請各位大佬評論區指出。

參考
riscv-spec-20240411.pdf
一起學RISC-V匯編第5講之常用指令及偽指令列表
RISC-V 常用匯編指令

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72752.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72752.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72752.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言 —— 愿此世如黃金般輝煌 - 進制轉換與操作符詳解

目錄 1. 操作符的分類 2. ?進制和進制轉換 2.1 2進制轉10進制 2.2 10進制轉2進制 2.3 2進制轉8進制 2.4 2進制轉16進制 3. 原碼、反碼、補碼 4. 移位操作符 4.1 左移操作符 4.2 右移操作符 5. 位操作符&#xff1a;&、|、^、~ 5.1 & 按位與 5.2 | 按位或 …

docker1

前言 技術架構 單機架構 應用數據分離架構 應用服務集群架構 讀寫分離/主從分離架構 寫入主的時候&#xff0c;要同步Mysql從的數據才可以 冷熱分離架構 寫的時候要寫入主和緩存數據庫 讀的時候先去緩存看有沒有&#xff0c;沒有的話就去從數據庫讀數據 主要就是看這個數據是…

Spring Boot整合ArangoDB教程

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 一、環境準備 JDK 17Maven 3.8Spring Boot 3.2ArangoDB 3.11&#xff08;本地安裝或Docker運行&#xff09; Docker啟動ArangoDB docker run -d --name ar…

從離散迭代到連續 常微分方程(Ordinary Differential Equation, ODE):梯度流

從離散迭代到連續 ODE&#xff1a;梯度下降與梯度流的奇妙聯系 在機器學習和優化領域&#xff0c;我們常常使用離散的迭代算法&#xff08;如梯度下降&#xff09;來求解目標函數的最優解。然而&#xff0c;你是否想過這些離散步驟背后可能隱藏著連續的動態&#xff1f;常微分…

常見的 Git 命令

基礎配置和信息查詢 (Setup and Information) git config --global user.name “Your Name”: 配置全局用戶名&#xff0c;用于 Git 提交記錄。 git config --global user.email “your.emailexample.com”: 配置全局用戶郵箱&#xff0c;同樣用于 Git 提交記錄。 git confi…

深度解析:視頻軟編碼與硬編碼的優劣對比

視頻編碼 一、基本原理與核心技術 壓縮原理 通過時空冗余消除實現數據壓縮&#xff1a; 空間冗余&#xff1a;利用幀內預測&#xff08;如DC/角度預測&#xff09;消除單幀內相鄰像素相似性。時間冗余&#xff1a;運動估計與補償技術&#xff08;ME/MC&#xff09;減少連續幀間…

藍耘智算 + 通義萬相 2.1:為 AIGC 裝上 “智能翅膀”,翱翔創作新天空

1. 引言&#xff1a;AIGC 的崛起與挑戰 在過去幾年中&#xff0c;人工智能生成內容&#xff08;AIGC&#xff09;技術突飛猛進。AIGC 涉及了文本生成、圖像創作、音樂創作、視頻制作等多個領域&#xff0c;并逐漸滲透到日常生活的方方面面。傳統的內容創作方式已經被許多人類創…

行為模式---中介者模式

概念 中介者模式是一種行為模式&#xff0c; 他的核心思想是通過引入一個中介者對象&#xff0c;將多個對象之間的復雜交互邏輯統一管理。每個對象只需要與中介者通信&#xff0c;而不需要直接與其他對象交互&#xff0c;從而降低系統的耦合度。 適用場景 對象之間交互復雜&…

百度移動生態事業群聚焦UGC戰略,貼吧迎新調整

易采游戲網3月8日獨家消息&#xff1a;近日據內部消息人士透露&#xff0c;百度移動生態事業群正積極將用戶生成內容&#xff08;UGC&#xff09;作為新的戰略重點。此舉標志著百度對UGC價值的重視與重塑&#xff0c;同時也預示著其旗下重要平臺——百度貼吧將迎來一輪重大的調…

C#模擬鼠標點擊,模擬鼠標雙擊,模擬鼠標恒定速度移動,可以看到軌跡

C#模擬鼠標點擊&#xff0c;模擬鼠標雙擊&#xff0c;模擬鼠標恒定速度移動&#xff0c;可以看到軌跡 using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks;namespa…

QGIS提取全國景區經緯度的完整流程

一、數據獲取與預處理 數據來源選擇 全國A級景區數據可從各省文化和旅游廳官網、國家文化和旅游部網站或第三方GIS數據平臺獲取。推薦使用2020-2021年更新的矢量數據&#xff08;shp格式&#xff09;或Excel表格&#xff0c;其中包含景區名稱、地址、等級及WGS84經緯度信息。例…

如何進行postgreSQL專家認證

進行 PostgreSQL 專家認證主要有信創 PostgreSQL 認證和中國 PostgreSQL 考試認證等方式&#xff0c;以下以信創 PostgreSQL 認證為例介紹具體步驟&#xff1a; 了解認證體系 信創 PostgreSQL 認證由工信部人才交流中心組織及頒發證書&#xff0c;包括以下三個級別&#xff1a;…

【前端】【webpack-dev-server】proxy跨域代理

參考&#xff1a;https://www.bilibili.com/video/BV1c5SnYZEnZ?spm_id_from333.788.videopod.episodes&vd_source65c8707649747fd67b232866b69a5ebd&p138

批量在 Word 的指定位置插入頁,如插入封面、末尾插入頁面

我們經常會碰到需要在 Word 文檔中插入新的頁面的需求&#xff0c;比如在 Word 文檔末尾插入一個廣告頁、給 Word 文檔插入一個說明封面&#xff0c;在 Word 文檔的中間位置插入新的頁面等等。相信這個操作對于大部分小伙伴來說都不難&#xff0c;難的是同時給多個 Word 文檔插…

在Windows 11的WSL中安裝Kali Linux

Kali Linux 是網絡安全從業者和愛好者的首選工具集&#xff0c;但直接在物理機或虛擬機上運行可能占用較多資源。借助 Windows Subsystem for Linux (WSL)&#xff0c;我們可以在Windows 11中原生運行Kali Linux&#xff0c;輕量且高效。本教程將手把手教你如何在WSL2中安裝并配…

Flow Size Prediction with Short Time Gaps

Flow Size Prediction with Short Time Gaps 網絡流量預測新突破&#xff1a;微秒級短流預測的可行性分析 在當今數據中心和云計算環境中&#xff0c;網絡流量的精準預測是優化資源分配、實現智能負載均衡的關鍵。傳統流量和預測聚焦于長時間間隔&#xff08;如秒級或分鐘級&…

pandas——to_datatime用法

Pandas中pd.to_datetime的用法及示例 pd.to_datetime 是 Pandas 庫中用于將字符串、整數或列表轉換為日期時間&#xff08;datetime&#xff09;對象的核心函數。它在處理時間序列數據時至關重要&#xff0c;能夠靈活解析多種日期格式并統一為標準時間類型。以下是其核心用法及…

數學建模:MATLAB強化學習

一、強化學習簡述 強化學習是一種通過與環境交互&#xff0c;學習狀態到行為的映射關系&#xff0c;以獲得最大積累期望回報的方法。包含環境&#xff0c;動作和獎勵三部分&#xff0c;本質是智能體通過與環境的交互&#xff0c;使得其作出的動作所得到的決策得到的總的獎勵達…

【leetcode hot 100 160】相交鏈表

解法一&#xff1a;&#xff08;哈希集合&#xff09;利用HashSet保存一個鏈表的值&#xff0c;循環另一個列表&#xff0c;在HashSet中尋找該值。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x…

19. 大數據-技術生態簡介

文章目錄 前言一、Hadoop介紹1. 簡介2. Hadoop發展史3. Hadoop現狀 二、Hadoop特性1. Hadoop國外應用2. Hadoop國內應用 三、Hadoop架構變遷1. 發行版本2. Hadoop架構變遷(1.0-2.0變遷)3. Hadoop架構變遷(3.0新版本)4. 綜述 四、技術生態體系 前言 大數據&#xff08;Big Data…