跳到內容

判斷敘述 & 跳躍敘述

使用cmp比較暫存器和另一個內容相不相等和大小

cmp rax, 200;

用完cmp會觸發相關旗標導致可以直接使用對應的跳躍敘述

jmp 直接跳躍
je 等於跳躍
jge 大於或等於跳躍
jg 大於跳躍
jle 小於或等於跳躍
jl 小於跳躍
jz ZF(零旗標)跳躍
jnz 無ZF跳躍

cmp執行的是減法(sub)的動作,將兩數相減但不保存,相等的話觸發ZF,其他情況觸發別的旗標
所以實際上je完全等於jz

來看一段範例:

_start:
mov rax, 2
mov rbx, 2
cmp rax, rbx
je equal
; TODO: 輸出不相等
jmp exit
equal:
; TODO: 輸出相等
exit:
; TODO: 離開程式

條件成立的話跳躍敘述會跳到對應的label,但程式依舊會由上往下執行,即使下面是別的區塊,所以要jmp至後面避免在不相等時執行到equal

執行完cmp後除了接跳躍敘述,還有相當方便的cmov開頭指令能用

cmove rax, rbx ; 等於的話執行mov
cmovne rax, rbx ; 不等於執行mov
cmovge rax, rbx ; 大於等於執行mov
cmovg rax, rbx ; 大於執行mov
cmovle rax, rbx ; 小於等於執行mov
cmovl rax, rbx ; 小於執行mov

跟跳躍敘述一樣的結尾,實際上就是英文縮寫
另外還有a結尾跟g一樣表示大於,a的意思是高於,用在無符號數,而g用在有符號數
因為負數的二進位前面有個1,b則是無符號的低於,對應l有符號的小於

若要判斷暫存器是否為零,最佳作法是

test rax, rax

使用test帶入兩個相同的暫存器,而不是 cmp rax, 0,test實際上做了and運算但不保存結果,會觸發ZF
當兩個內容都是0時,and的結果才會是0,在檢查零的情況使用test優於cmp

最後請練習完成中間的程式片段