首先看看:狀態寄存器(即標志寄存器)
PSW(Program Flag)程序狀態字(即標志)寄存器,是一個16位寄存器,由條件碼標志(flag)和控制標志構成,
如下所示:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
條件碼:
①OF(Overflow Flag)溢出標志,溢出時為1,否則置0.標明一個溢出了的計算,如:結構和目標不匹配.
②SF(Sign Flag)符號標志,結果為負時置1,否則置0.
③ZF(Zero Flag)零標志,運算結果為0時置1,否則置0.
④CF(Carry Flag)進位標志,進位時置1,否則置0.注意:Carry標志中存放計算后最右的位.
⑤AF(Auxiliary carry Flag)輔助進位標志,記錄運算時第3位(半個字節)產生的進位置。
有進位時1,否則置0.
⑥PF(Parity Flag)奇偶標志.結果操作數中1的個數為偶數時置1,否則置0.
控制標志位:
⑦DF(Direction Flag)方向標志,在串處理指令中控制信息的方向。
⑧IF(Interrupt Flag)中斷標志。
⑨TF(Trap Flag)陷井標志。
為舉例方便說一下jnz和jz
測試條件
JZ ZF=1
JNZ ZF=0
即Jz=jump if zero (結果為0則設置ZF零標志為1,跳轉)
Jnz=jump if not zero
好,接著來看test和cmp
*******************************************************************************
test屬于邏輯運算指令
功能: 執行BIT與BIT之間的邏輯運算
測試(兩操作數作與運算,僅修改標志位,不回送結果).
Test對兩個參數(目標,源)執行AND邏輯操作,并根據結果設置標志寄存器,結果本身不會保存。EST AX,BX 與 AND AX,BX 命令有相同效果
語法: TEST r/m,r/m/data
影響標志: C,O,P,Z,S(其中C與O兩個標志會被設為0)
運用舉例:
1.Test用來測試一個位,例如寄存器:
test eax, 100b; b后綴意為二進制
jnz ******; 如果eax右數第三個位為1,jnz將會跳轉
我是這樣想的,jnz跳轉的條件是ZF=0,ZF=0意味著ZF(零標志)沒被置位,即邏輯與結果為1.
2.Test的一個非常普遍的用法是用來測試一方寄存器是否為空:
test ecx, ecx
jz somewhere
如果ecx為零,設置ZF零標志為1,Jz跳轉
*******************************************************************************
CMP屬于算術運算指令
功能: 比較兩個值(寄存器,內存,直接數值)
語法: CMP r/m,r/m/data
標志位: C,P,A,Z,O
CMP比較.(兩操作數作減法,僅修改標志位,不回送結果).
cmp實際上是只設置標志不保存結構的減法,并設置Z-flag(零標志).
零標志很像carry,也是內部標志寄存器的一位.
例如:
Cmp eax, 2; 如果eax-2=0即eax=2就設置零標志為1
Jz ****; 如果設置了零標志就跳轉
*******************************************************************************
我得出的結論
test邏輯與運算結果為零,就把ZF(零標志)置1;
cmp 算術減法運算結果為零,就把ZF(零標志)置1.