Download presentation
Presentation is loading. Please wait.
1
第六章:條件處理
2
章節概要 布林和比較指令 條件跳越 條件迴圈指令 條件結構 應用: 有限狀態機器 使用. IF 指引
3
布林和比較指令 CPU 狀態旗標 AND 指令 OR 指令 XOR 指令 NOT 指令 應用 TEST 指令 CMP 指令
4
回顧狀態旗標 當運算的結果為0 時,零值旗標會呈現設定狀態.
如果指令運算所產生的結果,在被當成是有號數時,對目的運算元而言太大 ( 或太小) 了,則進位旗標會呈現設定狀態. 符號旗標呈現設定狀態,則目的運算元為負值,如果符號旗標呈現清除狀態,則目的運算元為正值 當指令運算產生了無效有號數時,則溢位旗標會呈現設定狀態 比較不重要: 當一個指令目的地運算元為低位元組中產生 1 位元的偶數時候,為同等標旗設定狀態. 附加的標旗設定狀態當運算產生進行3位元到4位元
5
AND 指令 AND 指令會執行兩個運算元中,每一對相對應位元之間的逐位元AND 布林運算,並且將結果存放於目的運算元 語法:
AND destination,source (相同的運算元類型當做 MOV) AND
6
OR 指令 OR 指令會執行兩個運算元中,每一對相對應位元之間的逐位元OR 布林運算,並且將結果存放於目的運算元 語法: OR
OR destination,source OR
7
XOR 指令 XOR 指令會執行兩個運算元中,每一對相對應位元之間的逐位元互斥OR 布林運算,並且將結果存放於目的運算元 語法: XOR
XOR destination, source XOR XOR 有一個特別的性質是,如果連續應用在相同的運算元上兩次,則運算元本身的值會被倒轉.
8
NOT 指令 NOT 指令會使運算元中的所有位元倒轉其值 語法: NOT destination NOT
9
應用 (1 of 5) 作業:將在 AL 的字元轉換成大寫. 解答:使用AND指令清除5位元.
mov al,'a' ; AL = b and al, b ; AL = b
10
應用 (2 of 5) 作業:把一個二進位十進制的位元組轉換成它的相等ASCII十進位的數字。 解答:使用OR指令設定4位元和5位元
mov al,6 ; AL = b or al, b ; AL = b The ASCII digit '6' = b
11
應用 (3 of 5) 作業:按下鍵盤 CapsLock 鍵
解答:使用OR指令在鍵盤標旗位元組中設定6位元在 0040:0017h 在BIOS資料區域中. mov ax,40h ; BIOS segment mov ds,ax mov bx,17h ; keyboard flag byte or BYTE PTR [bx], b ; CapsLock on 這個編碼只在實時處理模式執行,而不在Windows NT, 2000, or XP.下執行
12
應用 (4 of 5) 作業:如果一個整數是偶數,跳到標籤。 解答: AND 最小的位元是 1.如果結果是零,數字是偶數的
mov ax,wordVal and ax,1 ; low bit set? jz EvenValue ; jump if Zero flag set JZ(跳躍如果零)在第 6.3 節中被涵蓋。 Your turn: Write code that jumps to a label if an integer is negative.
13
應用 (5 of 5) 作業:如果在 AL 的值不是零,跳到標籤. 解答: OR位元組本身,使用 JNZ(跳躍如果不是零)指令。
or al,al jnz IsNotZero ; jump if not zero ORing任何的數不改變它的值.
14
TEST指令 TEST 指令會執行兩個運算元中,每對相對應位元之間隱含的AND 運算,並且依結果設定各旗標
沒有運算元被修正,但是零的標旗是受到影響. 例題:如果位元 0 或位元 1 在 AL 被設定,跳到標籤。 test al, b jnz ValueFound 例題:如果沒有位元 0 也沒有位元 1 在 AL 被設定,跳到標籤。 test al, b jz ValueNotFound
15
CMP 指令 (1 of 3) 對來源運算元的比較目的地運算元 語法: CMP destination, source
目的地的來源的非破壞性減少(目的地運算元不被改變) 語法: CMP destination, source 例題: destination == source mov al,5 cmp al,5 ; Zero flag set 例題: destination < source mov al,4 cmp al,5 ; Carry flag set
16
CMP 指令 (2 of 3) The comparisons shown so far were unsigned.
語法: destination > source mov al,6 cmp al,5 ; ZF = 0, CF = 0 (零和進位標旗很清楚) The comparisons shown so far were unsigned.
17
CMP 指令 (3 of 3) The comparisons shown here are performed with signed integers. 例題: destination > source mov al,5 cmp al,-2 ; Sign flag == Overflow flag 例題: destination < source mov al,-1 cmp al,5 ; Sign flag != Overflow flag
18
條件跳越 跳躍為基礎. . . 特定標旗 相等 無符號比較 符號比較 編碼字串 應用 位元測試(BT)指令
19
Jcond 指令 當旗標條件為真時,條件跳越指令會分支到目的標籤上。 例題: JB,JC 跳到標籤如果進位標旗被設定
JE, JZ如果零的標旗被設定,跳到標籤 JS對標籤的跳躍如果符號標旗被設定 JNE, JNZ如果零的標旗很清楚,跳到標籤 JECXZ對標籤的跳躍如果 ECX 等於 0
20
根據特定旗標值所執行的跳越動作
21
根據等式關係所執行的跳越動作
22
無號整數的比較結果所執行的跳越動作
23
有號數的比較結果所執行的跳越動作
24
應用 (1 of 5) 作業:如果無號的 EAX 是比 EBX 好,跳到標籤 解答: 使用CMP, 遵循 JA
cmp eax,ebx ja Larger 作業:如果無號的 EAX 是比 EBX 好,跳到標籤 解答: 使用CMP, 遵循 JA cmp eax,ebx jg Greater 作業:如果有號EAX比EBX好跳到標籤 解答: 使用CMP,遵循JG
25
應用 (2 of 5) 跳到標籤 L1 如果無號的EAX 是少於或者等於Val1 跳到標籤 L1 如果有號EAX是少於或者等於Val1
cmp eax,Val1 jbe L1 ; below or equal 跳到標籤 L1 如果無號的EAX 是少於或者等於Val1 cmp eax,Val1 jle L1 跳到標籤 L1 如果有號EAX是少於或者等於Val1
26
Applications (3 of 5) mov Large,bx cmp ax,bx jna Next mov Large,ax Next: Compare unsigned AX to BX, and copy the larger of the two into a variable named Large mov Small,ax cmp bx,ax jnl Next mov Small,bx Next: Compare signed AX to BX, and copy the smaller of the two into a variable named Small Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003.
27
應用 (4 of 5) 跳到標籤 L1 如果被 ESI 指向記憶字等於零 跳到標籤 L2 如果在被 EDI 指向記憶雙字組是偶數的
cmp WORD PTR [esi],0 je L1 跳到標籤 L2 如果在被 EDI 指向記憶雙字組是偶數的 test DWORD PTR [edi],1 jz L2
28
應用 (5 of 5) 作業:跳到標籤L1如果位元0,1,和3在AL全部被設定.
解答:除了位元0,1和3清除所有的位元.然後把結果與 二進作比較. and al, b ; clear unwanted bits cmp al, b ; check remaining bits je L1 ; all set? jump to L1
29
習題. . . 寫編碼跳到標籤L1如果位元是4,5,或6在BL暫存器中被設定。
寫編碼跳到標籤L2如果AL相同於偶數. 寫編碼跳到編籤L3如果EAX是負數. 寫編碼跳到標籤L4如果語法(EBX -ECX)是比零棒的。
30
加密字符串 下列的迴路使用XOR指令把在字串的每個字元轉變成新的值. KEY = 239 .data
buffer BYTE BUFMAX DUP(0) bufSize DWORD ? .code mov ecx,bufSize ; loop counter mov esi,0 ; index 0 in buffer L1: xor buffer[esi],KEY ; translate a byte inc esi ; point to next byte loop L1
31
字串加密程式 作業: 輸入來自使用者的一個訊息 (字串) 加密訊息 顯示加密訊息 解密訊息 顯示解密的訊息
顯示Encrypt.asm程式的原始碼。樣本輸出: Enter the plain text: Attack at dawn. Cipher text: «¢¢Äîä-Ä¢-ïÄÿü-Gs Decrypted: Attack at dawn.
32
BT (位元測試) 指令 選擇其第一個運算元的第n 位元,並且將它複製到進位旗標中 語法: BT bitBase, n
bitBase可能是 r/m 16 或 r/m 32 n 可能是r16, r32,或 imm8 例題:跳到編碼L1如果位元9在AX暫存器中被設定: bt AX,9 ; CF = bit 9 jc L1 ; jump if Carry
33
有條件的迴圈指令 LOOPZ 和 LOOPE LOOPNZ 和 LOOPNE
34
LOOPZ 和 LOOPE 語法: LOOPE 目的 LOOPZ 目的 邏輯: ECX ECX – 1
if ECX > 0 and ZF=1,跳到目的地 否則將不進行跳越的動作,而且控制權會轉移到下一個指令。
35
LOOPNZ 和 LOOPNE LOOPNZ (LOOPNE)是一個有條件的迴圈指令 語法: LOOPNZ destination
LOOPNE destination ECX ECX – 1; if ECX > 0 and ZF=0, jump to destination 否則將不進行跳越的動作,而且控制權會轉移到下一個指令。
36
LOOPNZ 例題 下列編碼發現陣列的第一個為整數數值: .data array SWORD -3,-6,-1,-10,10,30,40,4
sentinel SWORD 0 .code mov esi,OFFSET array mov ecx,LENGTHOF array next: test WORD PTR [esi],8000h ; test sign bit pushfd ; push flags on stack add esi,TYPE array popfd ; pop flags from stack loopnz next ; continue loop jnz quit ; none found sub esi,TYPE array ; ESI points to value quit:
37
習題. . . 設置陣列第一個非零價值。ESI 會指向緊接在陣列之後的Sentinel 值: .data
array SWORD 50 DUP(?) sentinel SWORD 0FFFFh .code mov esi,OFFSET array mov ecx,LENGTHOF array L1: cmp WORD PTR [esi],0 ; check for zero (fill in your code here) quit:
38
. . . (解) .data array SWORD 50 DUP(?) sentinel SWORD 0FFFFh .code
mov esi,OFFSET array mov ecx,LENGTHOF array L1: cmp WORD PTR [esi],0 ; check for zero pushfd ; push flags on stack add esi,TYPE array popfd ; pop flags from stack loope next ; continue loop jz quit ; none found sub esi,TYPE array ; ESI points to value quit:
39
條件結構 區塊結構式IF 敘述 複合運算式AND 複合運算式OR WHILE迴圈 表格驅動式選擇
40
區塊結構式IF 敘述 彙編語言電腦程式設計師能容易地翻譯邏輯陳述編寫C++/Java彙編語言: if( op1 == op2 )
X = 1; else X = 2; mov eax,op1 cmp eax,op2 jne L1 mov X,1 jmp L2 L1: mov X,2 L2:
41
習題. . . 實行下列虛擬碼彙編語言所有的值是無號的: (這一個問題有多樣的正確解決方法.) if( ebx <= ecx ) {
eax = 5; edx = 6; } cmp ebx,ecx ja next mov eax,5 mov edx,6 next: (這一個問題有多樣的正確解決方法.)
42
習題. . . 彙編語言實行下列的虛擬碼。所有的值是32位元有號整數: (這一個問題有多樣的正確解決辦法.)
if( var1 <= var2 ) var3 = 10; else { var3 = 6; var4 = 7; } mov eax,var1 cmp eax,var2 jle L1 mov var3,6 mov var4,7 jmp L2 L1: mov var3,10 L2: (這一個問題有多樣的正確解決辦法.)
43
複合運算式邏AND (1 of 3) 當實行邏輯AND運算,考慮HLLs捷徑估算
現在我們先來考慮下列虛擬碼,在此虛擬碼中,各數值都假定為無號整數 if (al > bl) AND (bl > cl) X = 1;
44
複合式運算AND (2 of 3) 這是可能的履行. . . if (al > bl) AND (bl > cl) X = 1;
cmp al,bl ; first expression... ja L1 jmp next L1: cmp bl,cl ; second expression... ja L2 L2: ; both are true mov X,1 ; set X to 1 next:
45
複合式運算AND (3 of 3) if (al > bl) AND (bl > cl) X = 1; 此程式碼的大小縮減了29% ( 七個指令降為五個),這是因為如果第一個JBE 指令沒有進行跳越,那麼CPU 便會直接進入第二個CMP 指令 : cmp al,bl ; first expression... jbe next ; quit if false cmp bl,cl ; second expression... mov X,1 ; both are true next:
46
習題. . . 彙編語言實行下列的虛擬碼。所有的值是無號的: (這一個問題有多樣的正確解決辦法.) if( ebx <= ecx
&& ecx > edx ) { eax = 5; edx = 6; } cmp ebx,ecx ja next cmp ecx,edx jbe next mov eax,5 mov edx,6 next: (這一個問題有多樣的正確解決辦法.)
47
複合式運算OR (1 of 2) 實行邏輯OR運算,考慮 HLLs 使用捷徑估算 在下列的例子中,如果第一個表達是真實的,第二個表達被跳越:
if (al > bl) OR (bl > cl) X = 1;
48
複合式運算OR (1 of 2) 我們能使用 “ 秋天直通式 ” 邏輯使編碼儘可能保持短:
if (al > bl) OR (bl > cl) X = 1; 我們能使用 “ 秋天直通式 ” 邏輯使編碼儘可能保持短: cmp al,bl ; is AL > BL? ja L1 ; yes cmp bl,cl ; no: is BL > CL? jbe next ; no: skip next statement L1: mov X,1 ; set X to 1 next:
49
WHILE 迴圈 WHILE 結構在執行一個區塊的敘述以前,會先測試迴圈條件是否成立。 考慮下列例題: 這是可能履行的:
while( eax < ebx) eax = eax + 1; top: cmp eax,ebx ; check loop condition jae next ; false? exit loop inc eax ; body of loop jmp top ; repeat the loop next: 這是可能履行的:
50
習題. . . 實行下列的迴圈,使用無號32位元整數: while( ebx <= val1) { ebx = ebx + 5;
val1 = val1 - 1 } top: cmp ebx,val1 ; check loop condition ja next ; false? exit loop add ebx,5 ; body of loop dec val1 jmp top ; repeat the loop next:
51
表格驅動式選擇(1 of 3) 一種使用表格查詢來取代多路選擇結構的方法 在使用這種方法之前,必須先建立一個表格,此表格必須包含欲查找的值
使用迴圈找表格 在須要進行大量比較工作時,此方法具有最佳的效益
52
表格驅動式選擇(2 of 3) Step 1:產生一個表格包含查詢值和彌補程序: .data
CaseTable BYTE 'A' ; lookup value DWORD Process_A ; address of procedure EntrySize = ($ - CaseTable) BYTE 'B' DWORD Process_B BYTE 'C' DWORD Process_C BYTE 'D' DWORD Process_D NumberOfEntries = ($ - CaseTable) / EntrySize
53
required for procedure pointers
表格驅動式選擇(3 of 3) Step 2:使用一個迴圈搜尋表格: mov ebx,OFFSET CaseTable ; point EBX to the table mov ecx,NumberOfEntries ; loop counter L1: cmp al,[ebx] ; match found? jne L2 ; no: continue call NEAR PTR [ebx + 1] ; yes: call the procedure jmp L3 ; and exit the loop L2: add ebx,EntrySize ; point to next entry loop L1 ; repeat until ECX = 0 L3: required for procedure pointers
54
應用:有限狀態機器 Start state Terminal state(s) Nonterminal state(s)
指的是一個依據某些輸入而改變狀態的機器或程式。 使用圖表來描述FSM 是相當容易的,在這樣的圖表中,會包含方形 圖形及方形與方形之間具有箭號的線條,其中,具有箭頭的線條稱為邊 或弧 ,而方形或圓形則稱為節點. 有限狀態機器是一種更具一般性的結構型態的特殊情形,這種更一般性的結構稱為有向圖 三個基本狀態代表節點: Start state Terminal state(s) Nonterminal state(s)
55
有限狀態機器 供應程式的控制流程的視覺追蹤 容易的修正 容易地以彙編語言實行 一個依據某些輸入而改變狀態的機器或程式
能被使用認可,或語言規則支配的字元的序列有效(被稱為了正規表示式) 優點: 供應程式的控制流程的視覺追蹤 容易的修正 容易地以彙編語言實行
56
FSM 例題 FSM 狀態B 到狀態C 的過渡,則只有當從輸入資料流中讀取到的是字母z 時: FSM認可好號整數:
57
習題. . . 以下是一個有號十進位整數的有限狀態機器的簡化圖,試問它能和第6.6.2 節中所示的哪一個圖形,運作得一樣好嗎?如果不能,請問為什麼不能?
58
實行FSM 下列各項在整數FSM中是來陳述編碼: 顯示 Finite.asm 原始碼. StateA:
call Getnext ; read next char into AL cmp al,'+' ; leading + sign? je StateB ; go to State B cmp al,'-' ; leading - sign? call IsDigit ; ZF = 1 if AL = digit jz StateC ; go to State C call DisplayErrorMsg ; invalid input found jmp Quit 顯示 Finite.asm 原始碼.
59
有號整數FSM 的流程圖 陳述 A 接受一個正負符號 , 或一個十進位的數字。
60
習題. . . 畫FSM圖表十六進位整數常數遵循MASM語法. 畫一個流程表陳述妳的FSM.
61
使用 .IF指令 Runtime 語法 Relational and Logical 運算 MASM-Generated 編碼
.REPEAT D指令 .WHILE 指令
62
Runtime 語法 .IF, .ELSE, .ELSEIF, 和 .ENDIF能用來評估執行時間語法而且產生區段-構成IF陳述。 例題:
.IF eax > ebx mov edx,1 .ELSE mov edx,2 .ENDIF .IF eax > ebx && eax > ecx mov edx,1 .ELSE mov edx,2 .ENDIF MASM 為你產生 “ 隱藏的 ” 編碼,有編碼標籤, CMP 和有條件的跳躍指令.
63
程式執行時期的關係和邏輯運算子
64
MASM產生編碼 Generated code: MASM自動地產生一次無號的跳躍(JBE). mov eax,6 cmp eax,val1
.data val1 DWORD 5 result DWORD ? .code mov eax,6 .IF eax > val1 mov result,1 .ENDIF Generated code: mov eax,6 cmp eax,val1 mov result,1 @C0001: MASM自動地產生一次無號的跳躍(JBE).
65
MASM-產生編碼 產生編碼: MASM自動地產生一次無號的跳躍(JLE). mov eax,6 cmp eax,val1
.data val1 SDWORD 5 result SDWORD ? .code mov eax,6 .IF eax > val1 mov result,1 .ENDIF 產生編碼: mov eax,6 cmp eax,val1 mov result,1 @C0001: MASM自動地產生一次無號的跳躍(JLE).
66
.REPEAT 指令 在嘗試與迴圈情況有關的之前執行環體,UNTIL 執行. 例題: ; Display integers 1 – 10:
mov eax,0 .REPEAT inc eax call WriteDec call Crlf .UNTIL eax == 10
67
.WHILE 指令 在執行環體之前測試迴圈情況.ENDW 指令標示迴圈的結束. 例題: ; Display integers 1 – 10:
mov eax,0 .WHILE eax < 10 inc eax call WriteDec call Crlf .ENDW
68
The End
Similar presentations