状态寄存器OF,CF,ZF,test,cmp的应用
一、狀態(tài)寄存器
首先看看:狀態(tài)寄存器(即標(biāo)志寄存器)
PSW(Program Status Word)程序狀態(tài)字(即標(biāo)志)寄存器,是一個(gè)16位寄存器,由條件碼標(biāo)志(flag)和控制標(biāo)志構(gòu)成,
如下所示:
條件碼:
①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)志。
test和cmp指令運(yùn)行后都會(huì)設(shè)置標(biāo)志位,為舉例方便說(shuō)一下jnz和jz
測(cè)試條件
JZ?? ZF=1
JNZ? ZF=0
即Jz=jump if zero (結(jié)果為0則設(shè)置ZF零標(biāo)志為1,跳轉(zhuǎn))
Jnz=jump if not zero
二、test指令和cmp指令
好,接著來(lái)看test和cmp
1、test指令
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ì)保存。TEST AX, BX 與 AND AX, BX 命令有相同效果
語(yǔ)法: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用來(lái)測(cè)試一個(gè)位,例如寄存器:
test eax, 100b;????????? b后綴意為二進(jìn)制
jnz? ******;???????????? 如果eax右數(shù)第三個(gè)位為1,jnz將會(huì)跳轉(zhuǎn)
jnz跳轉(zhuǎn)的條件非0,即ZF=0,ZF=0意味著零標(biāo)志沒(méi)被置位,即邏輯與結(jié)果為1。
2.Test的一個(gè)非常普遍的用法是用來(lái)測(cè)試一方寄存器是否為空:
test ecx, ecx
jz somewhere
如果ecx為零,設(shè)置ZF零標(biāo)志為1,Jz跳轉(zhuǎn)
2、cmp指令
CMP屬于算術(shù)運(yùn)算指令
功能: 比較兩個(gè)值(寄存器,內(nèi)存,直接數(shù)值)
語(yǔ)法: 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。
對(duì)于jz和jnz,查看代碼和理解匯編代碼時(shí),直接判斷test和cmp的運(yùn)算結(jié)果決定是否跳轉(zhuǎn),至于ZF標(biāo)記位是系統(tǒng)得知運(yùn)算結(jié)果的標(biāo)記位。
三、 直接標(biāo)志轉(zhuǎn)移
指令格式???????????????? 機(jī)器碼??????????????????? 測(cè)試條件?????????????????????? 如...則轉(zhuǎn)移 ?
JC?????????????????????????? 72?????????????????????????? C=1?????????????????????????????? 有進(jìn)位
JNC???????????????????????? 73????????????????????????? C=0?????????????????????????????? 無(wú)進(jìn)位
JZ/JE?????????????????????? 74????????????????????????? Z=1??????????????????????????????? 零/ ?
JNZ/JNE????????????????? 75???????????????????????? Z=0?????????????????????????????? 不為零/ ?
JS?????????????????????????? 78?????????????????????????? S=1??????????????????????????????? 負(fù)號(hào)
JNS???????????????????????? 79????????????????????????? S=0??????????????????????????????? 正號(hào)
JO?????????????????????????? 70????????????????????????? O=1?????????????????????????????? 有溢出
JNO???????????????????????? 71???????????????????????? O=0?????????????????????????????? 無(wú)溢出
JP/JPE???????????????????? 7A??????????????????????? P=1?????????????????????????????? 奇偶位為偶
JNP/IPO?????????????????? 7B??????????????????????? P=0?????????????????????????????? 奇偶位為奇
四、間接標(biāo)志轉(zhuǎn)移
先用cmp指令比較再用下面的判斷(少了一個(gè) JE 為等于):
指令格式????????? 機(jī)器碼???????????? 測(cè)試格式??????????????? 如...則轉(zhuǎn)移
JA/JNBE()??????? 77??????????????????? CZ=0????????????????????? >/ ?
JAE/JNB()??????? 73??????????????????? C=0??????????????????????? >=/ ?
JB/JNAE()??????? 72??????????????????? C=1??????????????????????? </ ?
JBE/JNA()??????? 76??????????????????? CZ=1????????????????????? <=/ ?
JG/JNLE()??????? 7F?????????????????? (SO)Z=0????????????????? >/ ?
JGE/JNL()??????? 7D?????????????????? SO=0????????????????????? >=/ ?
JL/JNGE()??????? 7C?????????????????? SO=1????????????????????? </ ?
JLE/JNG()??????? 7E?????????????????? (SO)Z=1????????????????? <=/
小結(jié)
test指令
將兩個(gè)操作數(shù)進(jìn)行邏輯與運(yùn)算,并根據(jù)運(yùn)算結(jié)果設(shè)置相關(guān)的標(biāo)志位。test命令的兩個(gè)操作數(shù)不會(huì)被改變。運(yùn)算結(jié)果在設(shè)置過(guò)相關(guān)標(biāo)記位后會(huì)被丟棄。
影響的標(biāo)志位CF,ZF,OF,SF,PF
cmp指令
比較指令。cmp的功能相當(dāng)于減法指令,只是對(duì)操作數(shù)之間運(yùn)算比較,不保存結(jié)果。cmp指令執(zhí)行后,將對(duì)標(biāo)志寄存器產(chǎn)生影響。其他相關(guān)指令通過(guò)識(shí)別這些被影響的標(biāo)志寄存器位來(lái)得知比較結(jié)果。
影響的標(biāo)志位CF,ZF,OF,AF,PF
總結(jié)
以上是生活随笔為你收集整理的状态寄存器OF,CF,ZF,test,cmp的应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 有趣的悖论
- 下一篇: CSDN博客编写快捷键