匯編指令-狀態(tài)寄存器、cmp、test、jz等指令詳細說明
一、狀態(tài)寄存器
首先看看:狀態(tài)寄存器(即標志寄存器)
PSW(Program Status Word)程序狀態(tài)字(即標志)寄存器,是一個16位寄存器,由條件碼標志(flag)和控制標志構(gòu)成,
如下所示:
條件碼:
①OF(Overflow Flag)溢出標志,溢出時為1,否則置0.標明一個溢出了的計算,如:結(jié)構(gòu)和目標不匹配。
②SF(Sign Flag)符號標志,結(jié)果為負時置1,否則置0。
③ZF(Zero Flag)零標志,運算結(jié)果為0時置1,否則置0。
④CF(Carry Flag)進位標志,進位時置1,否則置0.注意:Carry標志中存放計算后最右的位。
⑤AF(Auxiliary carry Flag)輔助進位標志,記錄運算時第3位(半個字節(jié))產(chǎn)生的進位置。
有進位時1,否則置0。
⑥PF(Parity Flag)奇偶標志.結(jié)果操作數(shù)中1的個數(shù)為偶數(shù)時置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 (結(jié)果為0則設置ZF零標志為1,跳轉(zhuǎn))
Jnz=jump if not zero
二、test指令和cmp指令
好,接著來看test和cmp
1、test指令
test屬于邏輯運算指令
功能:執(zhí)行BIT與BIT之間的邏輯運算
測試(兩操作數(shù)作與運算,僅修改標志位,不回送結(jié)果)。
Test對兩個參數(shù)(目標,源)執(zhí)行AND邏輯操作,并根據(jù)結(jié)果設置標志寄存器,結(jié)果本身不會保存。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右數(shù)第三個位為1,jnz將會跳轉(zhuǎn)
jnz跳轉(zhuǎn)的條件非0,即ZF=0,ZF=0意味著零標志沒被置位,即邏輯與結(jié)果為1。
2.Test的一個非常普遍的用法是用來測試一方寄存器是否為空:
test ecx, ecx
jz somewhere
如果ecx為零,設置ZF零標志為1,Jz跳轉(zhuǎn)
2、cmp指令
CMP屬于算術(shù)運算指令
功能: 比較兩個值(寄存器,內(nèi)存,直接數(shù)值)
語法: CMP r/m,r/m/data
標志位: C,P,A,Z,O
CMP比較.(兩操作數(shù)作減法,僅修改標志位,不回送結(jié)果)。
cmp實際上是只設置標志不保存結(jié)構(gòu)的減法,并設置Z-flag(零標志)。
零標志很像carry,也是內(nèi)部標志寄存器的一位。
例如:
Cmp eax, 2; 如果eax-2=0即eax=2就設置零標志為1
Jz ****; 如果設置了零標志就跳轉(zhuǎn)
得出的結(jié)論
test邏輯與運算結(jié)果為零,就把ZF(零標志)置1;
cmp 算術(shù)減法運算結(jié)果為零,就把ZF(零標志)置1。
對于jz和jnz,查看代碼和理解匯編代碼時,直接判斷test和cmp的運算結(jié)果決定是否跳轉(zhuǎn),至于ZF標記位是系統(tǒng)得知運算結(jié)果的標記位。
三、 直接標志轉(zhuǎn)移
指令格式 機器碼 測試條件 如...則轉(zhuǎn)移
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 奇偶位為奇
四、間接標志轉(zhuǎn)移
先用cmp指令比較再用下面的判斷(少了一個 JE 為等于):
指令格式 機器碼 測試格式 如...則轉(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指令
將兩個操作數(shù)進行邏輯與運算,并根據(jù)運算結(jié)果設置相關(guān)的標志位。test命令的兩個操作數(shù)不會被改變。運算結(jié)果在設置過相關(guān)標記位后會被丟棄。
影響的標志位CF,ZF,OF,SF,PF
cmp指令
比較指令。cmp的功能相當于減法指令,只是對操作數(shù)之間運算比較,不保存結(jié)果。cmp指令執(zhí)行后,將對標志寄存器產(chǎn)生影響。其他相關(guān)指令通過識別這些被影響的標志寄存器位來得知比較結(jié)果。
影響的標志位CF,ZF,OF,AF,PF
相關(guān)文章
VScode配置匯編語言環(huán)境的實現(xiàn)步驟
本文主要介紹了VScode配置匯編語言環(huán)境的實現(xiàn)步驟,文中通過圖文的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-03-03匯編語言XOR指令:對兩個操作數(shù)進行邏輯(按位)異或操作(推薦)
匯編語言(assembly language)是一種用于電子計算機、微處理器、微控制器或其他可編程器件的低級語言,亦稱為符號語言。這篇文章主要介紹了匯編語言XOR指令:對兩個操作數(shù)進行邏輯(按位)異或操作,需要的朋友可以參考下2020-01-01os_object_release Crash 排查記錄分析
這篇文章主要為大家介紹了os_object_release Crash 排查記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11