本章小目錄
一~六:Control
七:Miscellaneous
八:Extensions
九:Summary
bne x5, x0, Label,意思是如果x5和x0不相等,跳轉到 Label 行執行 code;否則繼續執行下一行。 addi x5, x0, 0
addi x6, x0, 10
Loop: add x5, x5, x6
addi x5, x5, -1
bne x5, x0, Loop
這裡Loop是 Labels,用於控制跳轉。beq x5, x6, Label
x5 和 x6 的值相等,則跳轉到 Label 標籤處繼續執行程式。bne x5, x6, Label
x5 和 x6 的值不相等,則跳轉到 Label 標籤處。blt x5, x6, Label
x5 小於 x6,則跳轉到 Label 標籤。bge x5, x6, Label
x5 大於或等於 x6,則跳轉到 Label 標籤。bltu x5, x6, Label
x5 小於 x6(作為無符號數比較),則跳轉到 Label 標籤。bgeu x5, x6, Label
x5 大於或等於 x6(作為無符號數比較),則跳轉到 Label 標籤。bgt 指令,但我們可以使用 blt 來替代,將比較對象對調即可。blt x6, x5, Label
bgt x5, x6, Label。jal 和 jalr 指令進行跳轉,並且會更新 PC(Program Counter)來決定下一行指令的位置。jal 是「Jump and Link」,會把跳轉前的位置儲存在暫存器中,以便跳轉結束後返回。jal x1,Label 和 jalr x1,x5,0。如何將 C 語言中的 for 迴圈轉換成 RISC-V 組合語言:
int A[20];
int sum = 0;
for (int i=0; i < 20; i++)
sum += A[i];
sum 的累加。jal 跳轉到指定的標籤,同時將返回位置儲存在 register 中,允許程式可以在跳轉完成後返回。jal 常用來模擬函數的行為。jal 跳轉到函數,並使用 jr 指令返回。這些指令不屬於其他分類,常作為輔助功能來使用:
lui, auipc:這兩個指令通常作為幫助指令來讓偽指令 li(加載立即值)和 la(加載地址)工作,很少單獨使用。
li x5,0xDEADBEEF 將立即值 0xDEADBEEF 儲存到 register x5。la x5,Label 將標籤 Label 的地址載入到 register x5。ebreak:這是與除錯器相關的行為。在一些模擬器中,這會停止程序執行,讓使用者可以插入來調試,就像其他除錯器中的中斷點一樣。
ecall:這是與作業系統相關的行為,涵蓋了程式無法自行完成的任務,例如輸出數據或通過 malloc 請求記憶體。
RISC-V 提供了許多可選擇由 CPU 實作的擴展:
乘法/除法擴展:由於乘法和除法運算在基本指令集上運行太慢,因此通常不包括在內,作為擴展來提供。
浮點數擴展:需要更多的硬件電路來支持浮點運算。
雙精度擴展:需要更多的硬件電路,且需要 64 位寄存器來支持雙精度運算。
其他擴展:針對不同的應用場景提供的擴展。
範例指令:
mul x5,x6,x7: 將 register x6 和 x7 的值相乘,並將結果存入 x5。