匯編語(yǔ)言中test和cmp有什么區(qū)別
匯編語(yǔ)言(assembly language)是一種用于電子計(jì)算機(jī)、微處理器、微控制器或其他可編程器件的低級(jí)語(yǔ)言,亦稱(chēng)為符號(hào)語(yǔ)言。在匯編語(yǔ)言中,用助記符代替機(jī)器指令的操作碼,用地址符號(hào)或標(biāo)號(hào)代替指令或操作數(shù)的地址。在不同的設(shè)備中,匯編語(yǔ)言對(duì)應(yīng)著不同的機(jī)器語(yǔ)言指令集,通過(guò)匯編過(guò)程轉(zhuǎn)換成機(jī)器指令。特定的匯編語(yǔ)言和特定的機(jī)器語(yǔ)言指令集是一一對(duì)應(yīng)的,不同平臺(tái)之間不可直接移植。下面看下匯編語(yǔ)言中test和cmp有什么區(qū)別,
匯編test和cmp區(qū)別
看過(guò)破解教程,都知道test,cmp是比較關(guān)鍵,可是我一直不清楚它們究竟是怎么比較的,最后下決心找了很多資料,和大家一起把它們弄清楚.
首先看看:狀態(tài)寄存器(即標(biāo)志寄存器)
PSW(Program Flag)程序狀態(tài)字(即標(biāo)志)寄存器,是一個(gè)16位寄存器,由條件碼標(biāo)志(flag)和控制標(biāo)志構(gòu)成,
如下所示:
條件碼:
①OF(Overflow Flag)溢出標(biāo)志,溢出時(shí)為1,否則置0.標(biāo)明一個(gè)溢出了的計(jì)算,如:結(jié)構(gòu)和目標(biāo)不匹配.
②SF(Sign Flag)符號(hào)標(biāo)志,結(jié)果為負(fù)時(shí)置1,否則置0.
③ZF(Zero Flag)零標(biāo)志,運(yùn)算結(jié)果為0時(shí)置1,否則置0.
④CF(Carry Flag)進(jìn)位標(biāo)志,進(jìn)位時(shí)置1,否則置0.注意:Carry標(biāo)志中存放計(jì)算后最右的位.
⑤AF(Auxiliary carry Flag)輔助進(jìn)位標(biāo)志,記錄運(yùn)算時(shí)第3位(半個(gè)字節(jié))產(chǎn)生的進(jìn)位置。
有進(jìn)位時(shí)1,否則置0.
⑥PF(Parity Flag)奇偶標(biāo)志.結(jié)果操作數(shù)中1的個(gè)數(shù)為偶數(shù)時(shí)置1,否則置0.
控制標(biāo)志位:
⑦DF(Direction Flag)方向標(biāo)志,在串處理指令中控制信息的方向。
⑧IF(Interrupt Flag)中斷標(biāo)志。
⑨TF(Trap Flag)陷井標(biāo)志。
為舉例方便說(shuō)一下jnz和jz
測(cè)試條件
JZ ZF=1
JNZ ZF=0
即Jz=j(luò)ump if zero (結(jié)果為0則設(shè)置ZF零標(biāo)志為1,跳轉(zhuǎn))
Jnz=j(luò)ump if not zero
好,接著來(lái)看test和cmp
test屬于邏輯運(yùn)算指令
功能: 執(zhí)行BIT與BIT之間的邏輯運(yùn)算
測(cè)試(兩操作數(shù)作與運(yùn)算,僅修改標(biāo)志位,不回送結(jié)果).
Test對(duì)兩個(gè)參數(shù)(目標(biāo),源)執(zhí)行AND邏輯操作,并根據(jù)結(jié)果設(shè)置標(biāo)志寄存器,結(jié)果本身不會(huì)保存。EST AX,BX 與 AND AX,BX 命令有相同效果
語(yǔ)法: TEST r/m,r/m/data
影響標(biāo)志: C,O,P,Z,S(其中C與O兩個(gè)標(biāo)志會(huì)被設(shè)為0)
運(yùn)用舉例:
1.Test用來(lái)測(cè)試一個(gè)位,例如寄存器:
test eax, 100b; b后綴意為二進(jìn)制
jnz **; 如果eax右數(shù)第三個(gè)位為1,jnz將會(huì)跳轉(zhuǎn)
我是這樣想的,jnz跳轉(zhuǎn)的條件是ZF=0,ZF=0意味著ZF(零標(biāo)志)沒(méi)被置位,即邏輯與結(jié)果為1.
2.Test的一個(gè)非常普遍的用法是用來(lái)測(cè)試一方寄存器是否為空:
test ecx, ecx
jz somewhere
如果ecx為零,設(shè)置ZF零標(biāo)志為1,Jz跳轉(zhuǎn)
CMP屬于算術(shù)運(yùn)算指令
功能: 比較兩個(gè)值(寄存器,內(nèi)存,直接數(shù)值)
語(yǔ)法: CMP r/m,r/m/data
標(biāo)志位: C,P,A,Z,O
CMP比較.(兩操作數(shù)作減法,僅修改標(biāo)志位,不回送結(jié)果).
cmp實(shí)際上是只設(shè)置標(biāo)志不保存結(jié)構(gòu)的減法,并設(shè)置Z-flag(零標(biāo)志).
零標(biāo)志很像carry,也是內(nèi)部標(biāo)志寄存器的一位.
例如:
Cmp eax, 2; 如果eax-2=0即eax=2就設(shè)置零標(biāo)志為1
Jz **; 如果設(shè)置了零標(biāo)志就跳轉(zhuǎn)
我得出的結(jié)論
test邏輯與運(yùn)算結(jié)果為零,就把ZF(零標(biāo)志)置1;
cmp 算術(shù)減法運(yùn)算結(jié)果為零,就把ZF(零標(biāo)志)置1.
結(jié)論很簡(jiǎn)單嘛,之前我怎么就分不清呢,真是笨哪!
ps:匯編語(yǔ)言中CMP的作用是什么?
mp(compare)指令進(jìn)行比較兩個(gè)操作數(shù)的大小。
1.匯編語(yǔ)言是面向機(jī)器的程序設(shè)計(jì)語(yǔ)言。在匯編語(yǔ)合中,用助記符代替操作碼,用地址符號(hào)或標(biāo)號(hào)代替地址碼。這樣用符號(hào)代替機(jī)器語(yǔ)言的二進(jìn)制碼,就把機(jī)器語(yǔ)言變成了匯編語(yǔ)言。于是匯編語(yǔ)言亦稱(chēng)為符號(hào)語(yǔ)言。使用匯編語(yǔ)言編寫(xiě)的程序,機(jī)器不能直接識(shí)別,要由一種程序?qū)R編語(yǔ)言翻譯成機(jī)器語(yǔ)言,這種起翻譯作用的程序叫匯編程序,匯編程序是系統(tǒng)軟件中語(yǔ)言處理系統(tǒng)軟件。匯編程序把匯編語(yǔ)言翻譯成機(jī)器語(yǔ)言的過(guò)程稱(chēng)為匯編。
2.例:cmp oprd1,oprd2,為第一個(gè)操作減去第二個(gè)操作數(shù),但不影響兩個(gè)操作數(shù)的值,它影響flag的CF,ZF,OF,AF,PF。若執(zhí)行指令后,ZF=1 則說(shuō)明兩個(gè)數(shù)相等,因?yàn)閦ero為1說(shuō)明結(jié)果為0。當(dāng)無(wú)符號(hào)時(shí),CF=1 則說(shuō)明了有進(jìn)位或借位,cmp是進(jìn)行的減操作,故可以看出為借位,所以,oprd1<oprd2。
3.CF=0 則說(shuō)明了無(wú)借位,但此時(shí)要注意ZF是否為0,若為0,則說(shuō)明結(jié)果不為0,故此時(shí)oprd1>oprd2,當(dāng)有符號(hào)時(shí),若SF=0,OF=0 則說(shuō)明了此時(shí)的值為正數(shù),沒(méi)有溢出,可以直觀的看出,oprd1>oprd2,若SF=1,OF=0 則說(shuō)明了此時(shí)的值為負(fù)數(shù),沒(méi)有溢出,則為oprd1<oprd2,若SF=0,OF=1 則說(shuō)明了此時(shí)的值為正數(shù),有溢出,可以看出oprd1<oprd2,若SF=1,OF=1則說(shuō)明了此時(shí)的值為負(fù)數(shù),有溢出,可以看出oprd1>oprd2。
總結(jié)
以上所述是小編給大家介紹的匯編語(yǔ)言中test和cmp有什么區(qū)別,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
os_object_release Crash 排查記錄分析
這篇文章主要為大家介紹了os_object_release Crash 排查記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11UEFI開(kāi)發(fā)實(shí)戰(zhàn)用戶(hù)交互界面使用說(shuō)明VFR文件
這篇文章主要為大家介紹了UEFI開(kāi)發(fā)實(shí)戰(zhàn)用戶(hù)交互界面使用說(shuō)明VFR文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06從匯編代碼開(kāi)始全面解析synchronized還原最真實(shí)的偏向鎖
這篇文章主要為大家介紹了從模板解釋器匯編源碼開(kāi)始分析還原最真實(shí)的偏向鎖實(shí)現(xiàn),解釋monitorenter字節(jié)碼命令的方法開(kāi)始,從匯編代碼開(kāi)始全面解析synchronized2022-02-02iOS匯編入門(mén)教程之在Xcode工程中嵌入?yún)R編代碼的方法
在Xcode中嵌入?yún)R編代碼主要依賴(lài)了C語(yǔ)言支持通過(guò) __asm__ 引入?yún)R編代碼的功能。這篇文章主要介紹了iOS匯編入門(mén)教程之在Xcode工程中嵌入?yún)R編代碼的方法,需要的朋友可以參考下2020-02-02匯編語(yǔ)言 and和or邏輯運(yùn)算指令的實(shí)現(xiàn)
這篇文章主要介紹了匯編語(yǔ)言 and,or邏輯運(yùn)算指令的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01