日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

状态寄存器OF,CF,ZF,test,cmp的应用

發布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 状态寄存器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的应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。