判斷敘述 & 跳躍敘述
判斷敘述 & 跳躍敘述
Section titled “判斷敘述 & 跳躍敘述”使用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
CMOVcc
Section titled “CMOVcc”執行完cmp後除了接跳躍敘述,還有相當方便的cmov開頭指令能用
cmove rax, rbx ; 等於的話執行movcmovne rax, rbx ; 不等於執行movcmovge rax, rbx ; 大於等於執行movcmovg rax, rbx ; 大於執行movcmovle rax, rbx ; 小於等於執行movcmovl 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
最後請練習完成中間的程式片段