状态寄存器OF,CF,ZF,test,cmp的应用
一、狀態寄存器
首先看看:狀態寄存器(即標志寄存器)
PSW(Program Status Word)程序狀態字(即標志)寄存器,是一個16位寄存器,由條件碼標志(flag)和控制標志構成,
如下所示:
條件碼:
①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)陷井標志。
test和cmp指令運行后都會設置標志位,為舉例方便說一下jnz和jz
測試條件
JZ?? ZF=1
JNZ? ZF=0
即Jz=jump if zero (結果為0則設置ZF零標志為1,跳轉)
Jnz=jump if not zero
二、test指令和cmp指令
好,接著來看test和cmp
1、test指令
test屬于邏輯運算指令
功能:執行BIT與BIT之間的邏輯運算
測試(兩操作數作與運算,僅修改標志位,不回送結果)。
Test對兩個參數(目標,源)執行AND邏輯操作,并根據結果設置標志寄存器,結果本身不會保存。TEST 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跳轉的條件非0,即ZF=0,ZF=0意味著零標志沒被置位,即邏輯與結果為1。
2.Test的一個非常普遍的用法是用來測試一方寄存器是否為空:
test ecx, ecx
jz somewhere
如果ecx為零,設置ZF零標志為1,Jz跳轉
2、cmp指令
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。
對于jz和jnz,查看代碼和理解匯編代碼時,直接判斷test和cmp的運算結果決定是否跳轉,至于ZF標記位是系統得知運算結果的標記位。
三、 直接標志轉移
指令格式???????????????? 機器碼??????????????????? 測試條件?????????????????????? 如...則轉移 ?
JC?????????????????????????? 72?????????????????????????? C=1?????????????????????????????? 有進位
JNC???????????????????????? 73????????????????????????? C=0?????????????????????????????? 無進位
JZ/JE?????????????????????? 74????????????????????????? Z=1??????????????????????????????? 零/ ?
JNZ/JNE????????????????? 75???????????????????????? Z=0?????????????????????????????? 不為零/ ?
JS?????????????????????????? 78?????????????????????????? S=1??????????????????????????????? 負號
JNS???????????????????????? 79????????????????????????? S=0??????????????????????????????? 正號
JO?????????????????????????? 70????????????????????????? O=1?????????????????????????????? 有溢出
JNO???????????????????????? 71???????????????????????? O=0?????????????????????????????? 無溢出
JP/JPE???????????????????? 7A??????????????????????? P=1?????????????????????????????? 奇偶位為偶
JNP/IPO?????????????????? 7B??????????????????????? P=0?????????????????????????????? 奇偶位為奇
四、間接標志轉移
先用cmp指令比較再用下面的判斷(少了一個 JE 為等于):
指令格式????????? 機器碼???????????? 測試格式??????????????? 如...則轉移
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????????????????? <=/
小結
test指令
將兩個操作數進行邏輯與運算,并根據運算結果設置相關的標志位。test命令的兩個操作數不會被改變。運算結果在設置過相關標記位后會被丟棄。
影響的標志位CF,ZF,OF,SF,PF
cmp指令
比較指令。cmp的功能相當于減法指令,只是對操作數之間運算比較,不保存結果。cmp指令執行后,將對標志寄存器產生影響。其他相關指令通過識別這些被影響的標志寄存器位來得知比較結果。
影響的標志位CF,ZF,OF,AF,PF
總結
以上是生活随笔為你收集整理的状态寄存器OF,CF,ZF,test,cmp的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有趣的悖论
- 下一篇: CSDN博客编写快捷键