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