汇编语言 test 和 cmp 区别
?
From:https://blog.csdn.net/zz709196484/article/details/77755243
?
看過破解教程,都知道 test,cmp 是比較關鍵,可是我一直不清楚它們究竟是怎么比較的,最后下決心找了很多資料,和大家一起把它們弄清楚.
首先看看:狀態寄存器(即標志寄存器)
PSW(Program Flag)程序狀態字(即標志)寄存器,是一個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)陷井標志。
為舉例方便說一下 jnz 和 jz 。測試條件:?
JZ ZF=1? ? ? 即 Jz =jump if ZF ( 結果為 0, 則設置 ZF 零標志為 1,跳轉)? JNZ ZF=0? ? 即??Jnz=jump if not ZF ( 結果不為 0,則設置 ZF 為 0 (0表示假) )好,接著來看 test 和 cmp
?
?
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 跳轉的條件是 ZF=0,ZF=0 意味著ZF(零標志)沒被置位,即邏輯與結果為1.
2.Test的一個非常普遍的用法是用來測試一個寄存器是否為空:
? ? ? ? test ecx, ecx?
? ? ? ? jz somewhere
? ? ? ? 如果 ecx 為零,設置 ZF 零標志為1,Jz跳轉
?
?
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
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的汇编语言 test 和 cmp 区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在 VC++ 中使用 内联汇编
- 下一篇: DOS 批处理