欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

匯編語言中test和cmp有什么區(qū)別

 更新時(shí)間:2020年01月18日 14:18:23   作者:Quartz010  
匯編語言(assembly language)是一種用于電子計(jì)算機(jī)、微處理器、微控制器或其他可編程器件的低級語言,亦稱為符號語言。這篇文章主要介紹了匯編語言中test和cmp有什么區(qū)別,需要的朋友可以參考下

匯編語言(assembly language)是一種用于電子計(jì)算機(jī)、微處理器、微控制器或其他可編程器件的低級語言,亦稱為符號語言。在匯編語言中,用助記符代替機(jī)器指令的操作碼,用地址符號或標(biāo)號代替指令或操作數(shù)的地址。在不同的設(shè)備中,匯編語言對應(yīng)著不同的機(jī)器語言指令集,通過匯編過程轉(zhuǎn)換成機(jī)器指令。特定的匯編語言和特定的機(jī)器語言指令集是一一對應(yīng)的,不同平臺之間不可直接移植。下面看下匯編語言中test和cmp有什么區(qū)別,

匯編test和cmp區(qū)別

看過破解教程,都知道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)符號標(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)志。

為舉例方便說一下jnz和jz

測試條件
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

好,接著來看test和cmp

test屬于邏輯運(yùn)算指令

功能: 執(zhí)行BIT與BIT之間的邏輯運(yùn)算
測試(兩操作數(shù)作與運(yùn)算,僅修改標(biāo)志位,不回送結(jié)果).
Test對兩個(gè)參數(shù)(目標(biāo),源)執(zhí)行AND邏輯操作,并根據(jù)結(jié)果設(shè)置標(biāo)志寄存器,結(jié)果本身不會保存。EST AX,BX 與 AND AX,BX 命令有相同效果

語法: TEST r/m,r/m/data
影響標(biāo)志: C,O,P,Z,S(其中C與O兩個(gè)標(biāo)志會被設(shè)為0)

運(yùn)用舉例:

1.Test用來測試一個(gè)位,例如寄存器:

test eax, 100b; b后綴意為二進(jìn)制
jnz **; 如果eax右數(shù)第三個(gè)位為1,jnz將會跳轉(zhuǎn)

我是這樣想的,jnz跳轉(zhuǎn)的條件是ZF=0,ZF=0意味著ZF(零標(biāo)志)沒被置位,即邏輯與結(jié)果為1.

2.Test的一個(gè)非常普遍的用法是用來測試一方寄存器是否為空:

test ecx, ecx
jz somewhere

如果ecx為零,設(shè)置ZF零標(biāo)志為1,Jz跳轉(zhuǎn)

CMP屬于算術(shù)運(yùn)算指令

功能: 比較兩個(gè)值(寄存器,內(nèi)存,直接數(shù)值)
語法: 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é)論很簡單嘛,之前我怎么就分不清呢,真是笨哪!

ps:匯編語言中CMP的作用是什么?

mp(compare)指令進(jìn)行比較兩個(gè)操作數(shù)的大小。

1.匯編語言是面向機(jī)器的程序設(shè)計(jì)語言。在匯編語合中,用助記符代替操作碼,用地址符號或標(biāo)號代替地址碼。這樣用符號代替機(jī)器語言的二進(jìn)制碼,就把機(jī)器語言變成了匯編語言。于是匯編語言亦稱為符號語言。使用匯編語言編寫的程序,機(jī)器不能直接識別,要由一種程序?qū)R編語言翻譯成機(jī)器語言,這種起翻譯作用的程序叫匯編程序,匯編程序是系統(tǒng)軟件中語言處理系統(tǒng)軟件。匯編程序把匯編語言翻譯成機(jī)器語言的過程稱為匯編。

2.例:cmp oprd1,oprd2,為第一個(gè)操作減去第二個(gè)操作數(shù),但不影響兩個(gè)操作數(shù)的值,它影響flag的CF,ZF,OF,AF,PF。若執(zhí)行指令后,ZF=1 則說明兩個(gè)數(shù)相等,因?yàn)閦ero為1說明結(jié)果為0。當(dāng)無符號時(shí),CF=1 則說明了有進(jìn)位或借位,cmp是進(jìn)行的減操作,故可以看出為借位,所以,oprd1<oprd2。

3.CF=0 則說明了無借位,但此時(shí)要注意ZF是否為0,若為0,則說明結(jié)果不為0,故此時(shí)oprd1>oprd2,當(dāng)有符號時(shí),若SF=0,OF=0 則說明了此時(shí)的值為正數(shù),沒有溢出,可以直觀的看出,oprd1>oprd2,若SF=1,OF=0 則說明了此時(shí)的值為負(fù)數(shù),沒有溢出,則為oprd1<oprd2,若SF=0,OF=1 則說明了此時(shí)的值為正數(shù),有溢出,可以看出oprd1<oprd2,若SF=1,OF=1則說明了此時(shí)的值為負(fù)數(shù),有溢出,可以看出oprd1>oprd2。

總結(jié)

以上所述是小編給大家介紹的匯編語言中test和cmp有什么區(qū)別,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • 16位匯編語言寄存器及指令整理(小結(jié))

    16位匯編語言寄存器及指令整理(小結(jié))

    這篇文章主要介紹了16位匯編語言寄存器及指令整理(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 8086匯編語言nasm版本

    8086匯編語言nasm版本

    這篇文章主要介紹了8086匯編語言nasm版本,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 匯編語言存儲及寄存器原理解析

    匯編語言存儲及寄存器原理解析

    這篇文章主要介紹了匯編語言存儲及寄存器原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • os_object_release Crash 排查記錄分析

    os_object_release Crash 排查記錄分析

    這篇文章主要為大家介紹了os_object_release Crash 排查記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 匯編語言中的segment

    匯編語言中的segment

    segment是段的意思,是段定義偽指令,一個(gè)正常的應(yīng)用程序被由若干個(gè) segment組成,接下來通過本文給大家介紹匯編語言中的segment,需要的朋友可以參考下
    2020-01-01
  • UEFI開發(fā)實(shí)戰(zhàn)用戶交互界面使用說明VFR文件

    UEFI開發(fā)實(shí)戰(zhàn)用戶交互界面使用說明VFR文件

    這篇文章主要為大家介紹了UEFI開發(fā)實(shí)戰(zhàn)用戶交互界面使用說明VFR文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 從匯編代碼開始全面解析synchronized還原最真實(shí)的偏向鎖

    從匯編代碼開始全面解析synchronized還原最真實(shí)的偏向鎖

    這篇文章主要為大家介紹了從模板解釋器匯編源碼開始分析還原最真實(shí)的偏向鎖實(shí)現(xiàn),解釋monitorenter字節(jié)碼命令的方法開始,從匯編代碼開始全面解析synchronized
    2022-02-02
  • iOS匯編入門教程之在Xcode工程中嵌入?yún)R編代碼的方法

    iOS匯編入門教程之在Xcode工程中嵌入?yún)R編代碼的方法

    在Xcode中嵌入?yún)R編代碼主要依賴了C語言支持通過 __asm__ 引入?yún)R編代碼的功能。這篇文章主要介紹了iOS匯編入門教程之在Xcode工程中嵌入?yún)R編代碼的方法,需要的朋友可以參考下
    2020-02-02
  • 從Go匯編角度解讀for循環(huán)的問題

    從Go匯編角度解讀for循環(huán)的問題

    Go常用的遍歷方式有兩種:for和for-range。這篇文章主要介紹了從Go匯編角度解讀for循環(huán)的兩個(gè)疑點(diǎn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 匯編語言 and和or邏輯運(yùn)算指令的實(shí)現(xiàn)

    匯編語言 and和or邏輯運(yùn)算指令的實(shí)現(xiàn)

    這篇文章主要介紹了匯編語言 and,or邏輯運(yùn)算指令的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01

最新評論