基本概念:
beq
(branch if equal):當兩個 registers 的值相等時跳轉到指定的標籤,例如 beq reg1, reg2, L1
。bne
(branch if not equal):當兩個 registers 的值不相等時跳轉。Branch 類型:
beq
和 bne
,還有比較數字大小的 blt
(branch if less than) 和 bge
(branch if greater than or equal)。j Label
。範例:
i == j
,則執行加法運算,否則執行減法運算的 if-else 語句:
if (i == j) bne x13, x14, Else
f = g + h; add x10, x11, x12
else j Exit
f = g - h; Else: sub x10, x11, x12
Exit:
比較運算:
blt
(比較是否小於) 和 bge
(比較是否大於或等於),還有對無符號數的比較指令 bltu
和 bgeu
。Logical Instructions 簡介:
常見指令:
and
、andi
): 將兩個 registers 的位元進行 AND 操作,and
是 registers 之間的操作,而 andi
則與立即數進行 AND 操作。
and x5, x6, x7
(x5 = x6 和 x7 的位元相交)or
、ori
): 進行位元的 OR 操作。xor
、xori
): 進行 XOR 操作,位元不同為 1,相同為 0。sll
(shift left logical):左移位,將位元往左移,並在右邊補 0。srl
(shift right logical):右移位,將位元往右移,左邊補 0。sra
(shift right arithmetic):右移位,但左邊補上符號位。沒有 NOT 指令:
not
指令,但可以使用 xor
與全 1 的值來達成邏輯反轉效果。範例:
slli x11, x12, 2 # x11 = x12 << 2
Assembler 到 Machine Code:
foo.S
和 bar.S
)會被轉換成對應的 Machine Code 的 object files(對象文件)(如 foo.o
、bar.o
)。程式的儲存:
程式執行:
Virtual Register 名稱:
a0-a7
,對應的 physical registers 為 x10-x17
。Pseudo Instructions:
mv rd, rs
= addi rd, rs, 0
li rd, 13
= addi rd, x0, 13
nop
= addi x0, x0, 0