匯編語言(assembly language)是一種用于電子計算機、微處理器、微控制器或其他可編程器件的低級語言,亦稱為符號語言。在匯編語言中,用助記符代替機器指令的操作碼,用地址符號或標號代替指令或操作數的地址。在不同的設備中,匯編語言對應著不同的機器語言指令集,通過匯編過程轉換成機器指令。特定的匯編語言和特定的機器語言指令集是一一對應的,不同平臺之間不可直接移植。下面看下匯編語言中test和cmp有什么區別,
匯編test和cmp區別
看過破解教程,都知道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
JNZ ZF=0
即Jz=jump if zero (結果為0則設置ZF零標志為1,跳轉)
Jnz=jump if not zero
好,接著來看test和cmp
test屬于邏輯運算指令
功能: 執行BIT與BIT之間的邏輯運算
測試(兩操作數作與運算,僅修改標志位,不回送結果).
Test對兩個參數(目標,源)執行AND邏輯操作,并根據結果設置標志寄存器,結果本身不會保存。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右數第三個位為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.
結論很簡單嘛,之前我怎么就分不清呢,真是笨哪!
ps:匯編語言中CMP的作用是什么?
mp(compare)指令進行比較兩個操作數的大小。
1.匯編語言是面向機器的程序設計語言。在匯編語合中,用助記符代替操作碼,用地址符號或標號代替地址碼。這樣用符號代替機器語言的二進制碼,就把機器語言變成了匯編語言。于是匯編語言亦稱為符號語言。使用匯編語言編寫的程序,機器不能直接識別,要由一種程序將匯編語言翻譯成機器語言,這種起翻譯作用的程序叫匯編程序,匯編程序是系統軟件中語言處理系統軟件。匯編程序把匯編語言翻譯成機器語言的過程稱為匯編。
2.例:cmp oprd1,oprd2,為第一個操作減去第二個操作數,但不影響兩個操作數的值,它影響flag的CF,ZF,OF,AF,PF。若執行指令后,ZF=1 則說明兩個數相等,因為zero為1說明結果為0。當無符號時,CF=1 則說明了有進位或借位,cmp是進行的減操作,故可以看出為借位,所以,oprd1<oprd2。
3.CF=0 則說明了無借位,但此時要注意ZF是否為0,若為0,則說明結果不為0,故此時oprd1>oprd2,當有符號時,若SF=0,OF=0 則說明了此時的值為正數,沒有溢出,可以直觀的看出,oprd1>oprd2,若SF=1,OF=0 則說明了此時的值為負數,沒有溢出,則為oprd1<oprd2,若SF=0,OF=1 則說明了此時的值為正數,有溢出,可以看出oprd1<oprd2,若SF=1,OF=1則說明了此時的值為負數,有溢出,可以看出oprd1>oprd2。
總結
以上所述是小編給大家介紹的匯編語言中test和cmp有什么區別,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對html5模板網網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!