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