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