本章小目錄
一~六: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。