2015-04-21 29 views

回答

5

如果您剛剛使用的前修改ZF的指令,只需檢查標誌,並使用JZJE跳。例如

and rax, rbx ; ZF was modified 
jz is_zero ; so to check if rax is zero, a single jump is enough 

如果沒有設置ZF,則需要明確地執行此操作。最顯而易見的方法是

cmp rax, 0 
je equal_zero 

但是,由於cmp較長,如果你看一下輸出二進制中,test或有時and, or優先

83F800 cmp eax, 0 
09C0 or eax, eax 
85C0 test eax, eax 

產生的代碼將是

test rax, rax 
jz is_zero 

你可以從編譯器中獲取程序集輸出,並通過在線工具(如gcc godbolt

012)進行檢查或查看

瞭解更多:http://en.wikibooks.org/wiki/X86_Assembly/Control_Flow

10
test %eax, %eax ; set ZF to 1 if eax == 0 
je 0x804f430  ; jump to 0x00804f4 if ZF == 1 

ZF是單個比特零標誌將被設置爲1,如果eax等於零。 je將採取跳轉到0x804f430如果ZF被設置爲1

+1

你的回答是正確的。另一個正確的答案是用'cmp $ 0,%eax'替換'test'。 – Nayuki

+5

@NayukiMinase測試短於cmp http://stackoverflow.com/questions/147173/x86-assembly-testl-eax-against-eax?rq=1 –

+3

'jz'可能是一個更助記的選擇。 (當然這是相同的指令。) – gsg