Intel汇编语言程序设计学习-第六章 条件处理-上
條件處理
本章要點
1.簡介
2.布爾和比較指令
3.條件跳轉(zhuǎn)
4.條件循環(huán)指令
5.條件結(jié)構(gòu)
6.應(yīng)用:有限狀態(tài)機
7.決策偽指令
6.1 ?簡介
? ? 本章,讀者將看到高級條件分支如何翻譯成底層的實現(xiàn)代碼。
處理硬件設(shè)備的程序必須能夠操控數(shù)字中的單個數(shù)據(jù)位,應(yīng)該能夠測試清楚和設(shè)置數(shù)據(jù)位。數(shù)據(jù)加密和壓縮也依賴于位操作。
? 本章試圖解答如下基本問題:
? 1.如何使用1章中介紹的布爾運算符(AND,OR和NOT)?
? 2.在匯編語言中如何寫一條IF語句?
? 3.編譯器是如何將嵌套的IF語句翻譯成機器語言的?
? 4.如何設(shè)置和清楚二進制數(shù)字中的單個位?
? 5.在布爾表達(dá)式中有符號和無符號樹有什么區(qū)別?
? 6.什么是有限狀態(tài)機?
? 7.GOTO語句真是有害的嗎?
? ? 本章遵循自底向上的姿勢,首先講述程序邏輯背后的二進制基礎(chǔ)知識,接下來講述如何使用CPU指令和處理器狀態(tài)標(biāo)識來比較操作數(shù),最后將所有這些進行綜合講述如何使用匯編語言實現(xiàn)高級語言的邏輯結(jié)構(gòu)。
6.2 ?布爾和比較指令
? ? 下面開始在二進制層次學(xué)習(xí)如何進行條件處理,使用布爾代數(shù)中的4種基本操作-AND,OR,XOR和NOT,這類操作在計算機硬件和軟件設(shè)計中都有廣泛的應(yīng)用。
? ? IA-32指令集中包括AND,OR,XOR,NOT,TEST和BTop指令,直接實現(xiàn)了字節(jié)、字和雙字的布爾運算。
? ??
6.2.1 ?CPU的狀態(tài)標(biāo)志
? ? 布爾指令影響零標(biāo)志、進位標(biāo)志、符號標(biāo)志、溢出標(biāo)志和奇偶標(biāo)志。
? ? 1.零標(biāo)志操作的結(jié)果等于0時置位。
? ? 2.進位標(biāo)志在指令執(zhí)行產(chǎn)生的結(jié)果(視為無符號整數(shù))對目的操作數(shù)而言太大(或太小)而無法容納時的置位。
? ? 3.符號標(biāo)志是目的操作數(shù)高位的一份副本,如果目的操作數(shù)為負(fù)數(shù)則設(shè)置該標(biāo)志,如果是正數(shù)則清零。
? ? 4.溢出標(biāo)志在指令產(chǎn)生的有符號結(jié)果無效時置位。
? ? 5.在指令的操作數(shù)的低字節(jié)中,為1的數(shù)據(jù)位的數(shù)據(jù)量偶數(shù)時設(shè)置奇偶標(biāo)志。
6.2.2 AND指令
? ? AND指令在每對操作數(shù)的對應(yīng)數(shù)據(jù)位之間執(zhí)行布爾(位)“與”操作并把結(jié)果放在目的操作數(shù)中:
? ? AND 目的操作數(shù),源操作數(shù),下面的操作數(shù)格式都是允許的:
? ? AND reg ,reg
? ? AND reg ,mem
? ? AND reg ,imm
? ? AND mem,reg
? ? ANDmem,imm
6.2.3 ?OR指令
? ? 格式和AND一樣......
? ? 影響的標(biāo)志位:OR指令總是清除溢出標(biāo)志和進位標(biāo)志。它根據(jù)目的操作數(shù)的值修改符號標(biāo)志、零標(biāo)志、奇偶標(biāo)志。可以把一個數(shù)字同自身進行“或”運算以獲取關(guān)于其值的某些信息,如:
or al,al
零標(biāo)志和符號標(biāo)志的值與AL中的內(nèi)容關(guān)系如下:
?
?6.2.4 XOR指令
? ? XOR指令在每對操作數(shù)的對應(yīng)數(shù)據(jù)之間執(zhí)行布爾“異或”操作,格式個AND一樣。
? ? 影響的標(biāo)志:XOR指令總是清楚溢出標(biāo)志和進位標(biāo)志,它依據(jù)目的操作數(shù)的值修改零標(biāo)志和奇偶標(biāo)志。
檢查奇偶標(biāo)志:奇偶標(biāo)志位表明了位做操作或幻速運算結(jié)果的最低字節(jié)包含為1的數(shù)據(jù)的個數(shù)是奇數(shù)還是偶數(shù)。當(dāng)為1的數(shù)據(jù)位為歐舒適設(shè)置奇偶標(biāo)志,為奇數(shù)時清除該標(biāo)志。檢驗數(shù)字中為1的數(shù)據(jù)位個數(shù)的奇偶性的方法之一是將數(shù)字同全0字節(jié)進行異或運算,無需改變其值:
?
6.2.5 ?NOT指令
? ? NOT指令對于一個操作數(shù)所有數(shù)據(jù)位取反,得到的結(jié)果成為該操作數(shù)的反碼。該指令允許下面的操作數(shù)據(jù)類型:
? ? NOT ?reg
? ? NOT ?mem
? 影響的標(biāo)志:NOT指令不影響任何狀態(tài)標(biāo)志。
6.2.6 ?TEST指令
? ? TEST指令在沒對操作數(shù)的對應(yīng)數(shù)據(jù)位之間執(zhí)行隱含的“與”操作,并相應(yīng)設(shè)置標(biāo)志位。TEST指令和AND指令之間的唯一區(qū)別在于TEST指令餅不修改目的操作數(shù)。TEST指令的操作數(shù)格式與AND相同,該指令在測試操作數(shù)某些為是否被設(shè)置時特別有用。
6.2.7 ?CMP指令
? ? CMP指令在源操作數(shù)和目的操作數(shù)之間執(zhí)行隱含的減法操作,兩個操作數(shù)都不會被修改:
? ? CMP ?目的操作數(shù),源操作數(shù)
CMP指令與AND指令的操作數(shù)格式相同。
? ? 影響的標(biāo)志:CMP指令根據(jù)對目的操作數(shù)進行假象的減法操作后目的操作數(shù)的值修改溢出標(biāo)志、符號標(biāo)志、零標(biāo)志、進位標(biāo)志、輔助進位標(biāo)志和奇偶變址的值。在比較兩個無符號操作數(shù)的時候,零標(biāo)志和進位標(biāo)志反應(yīng)了兩個操作數(shù)之間的關(guān)系:
??
???如果比較的兩個操作數(shù)是有符號的,則符號標(biāo)志、零標(biāo)志、溢出標(biāo)志與兩個操作數(shù)之間的關(guān)系如下表所示:
??
???CMP指令時創(chuàng)建條件邏輯結(jié)構(gòu)的有效工具。IF語句在匯編語言中等價于在CMP指令后
跟一條條件跳轉(zhuǎn)指令。
例子:下面我們來看三個代碼片段,以弄清CMP指令時如何影響標(biāo)志的。在AX中裝入5并且和10進行比較的時候,由于5-10需要借位,因此CF標(biāo)志置位:
mov ax,5
cmp ax,10
?
? ? 比較1000和1000會設(shè)置零標(biāo)志位,因為從源數(shù)中減去目的數(shù)得到的結(jié)果是0:
?
? ? 比較105和0會清楚零標(biāo)志和進位標(biāo)志,因為105大于0:
?
6.2.8 ?設(shè)置和清除單個CPU狀態(tài)標(biāo)志
? ? 如何設(shè)置和清除零標(biāo)志、符號標(biāo)志、進位標(biāo)志和溢出標(biāo)志?有很多種方法,但大多數(shù)方法都需要修改目的操作數(shù)。要設(shè)置零標(biāo)志,可以講操作數(shù)同0進行TEST或AND操作;要想清除零標(biāo)志,可以將操作數(shù)同1進行OR操作:
? ? test ??al ,0 ???;設(shè)置零標(biāo)志
? ? and ??al ,0 ???;設(shè)置零標(biāo)志
? ? or ???al ,1 ???;清楚零標(biāo)志
 
? ? TEST指令不會修改操作數(shù),不過AND操作修改操作數(shù)。要設(shè)置符號標(biāo)志,將操作數(shù)的最高位同1進行OR操作;要清楚該標(biāo)志,將操作數(shù)的高位同0進行AND操作:
or ?al ,80h ?;設(shè)置符號標(biāo)志
and al ,7Fh ?;清楚符號標(biāo)志
? ?使用STC指令可以設(shè)置進位標(biāo)志,使用CLC指令可以清除進位標(biāo)志:
????stc ???;設(shè)置進位標(biāo)志
????clc ???;清楚進位標(biāo)志
? ? 要設(shè)置溢出標(biāo)志,把兩個將得到復(fù)數(shù)和的整數(shù)字節(jié)相加;要清楚溢出標(biāo)志,將操作數(shù)同0進行OR操作:
mov ?al ,7Fh ?;al = +127
inc ??al ?????;al =80h(-128) ,OF = 1
or ???eax ,0 ?;清除溢出標(biāo)志? ??
總結(jié)
以上是生活随笔為你收集整理的Intel汇编语言程序设计学习-第六章 条件处理-上的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Windows核心编程 第四章 进程(上
- 下一篇: Intel汇编语言程序设计学习-第六章
