Transcript Chapter 6

第六章:條件處理
章節概要
•
•
•
•
•
•
布林和比較指令
條件跳越
條件迴圈指令
條件結構
應用: 有限狀態機器
使用. 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
AND destination,source
(相同的運算元類型當做 MOV)
00111011
AND 0 0 0 0 1 1 1 1
cleared
00001011
unchanged
Web site
Examples
5
OR 指令
• OR 指令會執行兩個運算元中,每一對相對應位元之
間的逐位元OR 布林運算,並且將結果存放於目的運
算元
• 語法:
OR
OR destination,source
00111011
OR 0 0 0 0 1 1 1 1
unchanged
00111111
set
Web site
Examples
6
XOR 指令
• XOR 指令會執行兩個運算元中,每一對相對應位元之
間的逐位元互斥OR 布林運算,並且將結果存放於目
的運算元
XOR
• 語法:
XOR destination, source
00111011
XOR 0 0 0 0 1 1 1 1
unchanged
00110100
inverted
XOR 有一個特別的性質是,如果連續應用在相同的運算元上兩
次,則運算元本身的值會被倒轉.
Web site
Examples
7
NOT 指令
• NOT 指令會使運算元中的所有位元倒轉其值
• 語法:
NOT destination
NOT
NOT
00111011
11000100
inverted
Web site
Examples
8
應用
(1 of 5)
• 作業:將在 AL 的字元轉換成大寫.
• 解答:使用AND指令清除5位元.
mov al,'a'
and al,11011111b
; AL = 01100001b
; AL = 01000001b
Web site
Examples
9
應用 (2 of 5)
• 作業:把一個二進位十進制的位元組轉換成它的相等ASCII
十進位的數字。
• 解答:使用OR指令設定4位元和5位元
mov al,6
or al,00110000b
; AL = 00000110b
; AL = 00110110b
The ASCII digit '6' = 00110110b
Web site
Examples
10
應用 (3 of 5)
• 作業:按下鍵盤 CapsLock 鍵
• 解答:使用OR指令在鍵盤標旗位元組中設定6位元在
0040:0017h 在BIOS資料區域中.
mov ax,40h
mov ds,ax
mov bx,17h
or BYTE PTR [bx],01000000b
; BIOS segment
; keyboard flag byte
; CapsLock on
這個編碼只在實時處理模式執行,而不在Windows NT, 2000,
or XP.下執行
Web site
Examples
11
應用 (4 of 5)
• 作業:如果一個整數是偶數,跳到標籤。
• 解答: AND 最小的位元是 1.如果結果是零,數字是偶數的
mov ax,wordVal
and ax,1
jz EvenValue
; 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 IsNotZero
; jump if not zero
ORing任何的數不改變它的值.
Web site
Examples
13
TEST指令
• TEST 指令會執行兩個運算元中,每對相對應位元之間隱含的
AND 運算,並且依結果設定各旗標
• 沒有運算元被修正,但是零的標旗是受到影響.
• 例題:如果位元 0 或位元 1 在 AL 被設定,跳到標籤。
test al,00000011b
jnz ValueFound
• 例題:如果沒有位元 0 也沒有位元 1 在 AL 被設定,跳到標籤。
test al,00000011b
jz
ValueNotFound
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)
• 跳到標籤 L1 如果無號的EAX 是少於或者等於Val1
cmp eax,Val1
jbe L1
; below or equal
• 跳到標籤 L1 如果有號EAX是少於或者等於Val1
cmp eax,Val1
jle L1
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)
• 跳到標籤 L1 如果被 ESI 指向記憶字等於零
cmp WORD PTR [esi],0
je L1
• 跳到標籤 L2 如果在被 EDI 指向記憶雙字組是偶數的
test DWORD PTR [edi],1
jz
L2
Web site
Examples
27
應用
(5 of 5)
• 作業:跳到標籤L1如果位元0,1,和3在AL全部被設定.
• 解答:除了位元0,1和3清除所有的位元.然後把結果與
00001011 二進作比較.
and al,00001011b
cmp al,00001011b
je L1
; clear unwanted bits
; check remaining bits
; all set? jump to L1
Web site
Examples
28
習題. . .
• 寫編碼跳到標籤L1如果位元是4,5,或6在BL暫存器中被
設定。
• 寫編碼跳到標籤L1如果位元是4,5,或6在BL暫存器中全
部被設定。
• 寫編碼跳到標籤L2如果AL相同於偶數.
• 寫編碼跳到編籤L3如果EAX是負數.
• 寫編碼跳到標籤L4如果語法(EBX -ECX)是比零棒
的。
Web site
Examples
29
加密字符串
下列的迴路使用XOR指令把在字串的每個字元轉變成新的值.
KEY = 239
.data
buffer BYTE BUFMAX DUP(0)
bufSize DWORD ?
.code
mov ecx,bufSize
mov esi,0
L1:
xor buffer[esi],KEY
inc esi
loop L1
; 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 bitBase, n
• bitBase可能是 r/m 16 或 r/m 32
• n 可能是r16, r32,或 imm8
• 例題:跳到編碼L1如果位元9在AX暫存器中被設定:
bt AX,9
jc L1
; CF = bit 9
; jump if Carry
Web site
Examples
32
有條件的迴圈指令
• LOOPZ 和 LOOPE
• LOOPNZ 和 LOOPNE
Web site
Examples
33
LOOPZ 和 LOOPE
• 語法:
LOOPE 目的
LOOPZ 目的
• 邏輯:
• ECX  ECX – 1
• if ECX > 0 and ZF=1,跳到目的地
• 否則將不進行跳越的動作,而且控制權會轉移到下一個
指令。
Web site
Examples
34
LOOPNZ 和 LOOPNE
• LOOPNZ (LOOPNE)是一個有條件的迴圈指令
• 語法:
LOOPNZ destination
LOOPNE destination
• 語法:
• ECX  ECX – 1;
• if ECX > 0 and ZF=0, jump to destination
• 否則將不進行跳越的動作,而且控制權會轉移到下一
個指令。
Web site
Examples
35
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:
Web site
Examples
36
習題. . .
設置陣列第一個非零價值。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:
Web site
Examples
37
. . . (解)
.data
array SWORD 50 DUP(?)
sentinel SWORD 0FFFFh
.code
mov esi,OFFSET array
mov ecx,LENGTHOF array
L1: 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( op1 == op2 )
X = 1;
else
X = 2;
mov
cmp
jne
mov
jmp
L1: mov
L2:
Web site
eax,op1
eax,op2
L1
X,1
L2
X,2
Examples
40
習題. . .
實行下列虛擬碼彙編語言所有的值是無號的:
if( ebx <= ecx )
{
eax = 5;
edx = 6;
}
cmp
ja
mov
mov
next:
ebx,ecx
next
eax,5
edx,6
(這一個問題有多樣的正確解決方法.)
Web site
Examples
41
習題. . .
彙編語言實行下列的虛擬碼。所有的值是32位元有號整
數:
if( var1
var3 =
else
{
var3 =
var4 =
}
<= var2 )
10;
6;
7;
mov
cmp
jle
mov
mov
jmp
L1: mov
L2:
eax,var1
eax,var2
L1
var3,6
var4,7
L2
var3,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 L1
jmp next
; first expression...
cmp bl,cl
ja L2
jmp next
; second expression...
L1:
L2:
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
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
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
L1: mov
next:
al,bl
L1
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 <= val1)
{
ebx = ebx + 5;
val1 = val1 - 1
}
top: cmp
ja
add
dec
jmp
next:
ebx,val1
next
ebx,5
val1
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
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
Web site
Examples
52
表格驅動式選擇(3 of 3)
Step 2:使用一個迴圈搜尋表格:
mov ebx,OFFSET CaseTable
mov ecx,NumberOfEntries
L1: cmp al,[ebx]
jne L2
call NEAR PTR [ebx + 1]
jmp L3
L2: add ebx,EntrySize
loop L1
; 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
L3:
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 時:
'a'..'y'
start
'x'
A
C
B
'z
'
• FSM認可好號整數:
digit
C
digit
start
A
+,-
digit
B
Web site
Examples
56
習題. . .
• 以下是一個有號十進位整數的有限狀態機器的簡化圖,
試問它能和第6.6.2 節中所示的哪一個圖形,運作得一
樣好嗎?如果不能,請問為什麼不能?
digit
digit
start
A
+,-
B
Web site
Examples
57
實行FSM
下列各項在整數FSM中是來陳述編碼:
StateA:
call Getnext
cmp al,'+'
je StateB
cmp al,'-'
je StateB
call IsDigit
jz StateC
call DisplayErrorMsg
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 的流程圖
StateA
GetNext
AL = '+' ?
true
StateB
false
陳述 A 接受一個正負符號 ,
或一個十進位的數字。
AL = '-' ?
true
StateB
false
IsDigit
ZF = 1 ?
true
StateC
false
DisplayErrorMsg
quit
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, .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 和
有條件的跳躍指令.
Web site
Examples
62
程式執行時期的關係和邏輯運算子
Web site
Examples
63
MASM產生編碼
.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
jbe @C0001
mov result,1
@C0001:
MASM自動地產生一次無號的跳躍(JBE).
Web site
Examples
64
MASM-產生編碼
.data
val1
SDWORD 5
result SDWORD ?
.code
mov eax,6
.IF eax > val1
mov result,1
.ENDIF
產生編碼:
mov eax,6
cmp eax,val1
jle @C0001
mov result,1
@C0001:
MASM自動地產生一次無號的跳躍(JLE).
Web site
Examples
65
.REPEAT 指令
在嘗試與迴圈情況有關的之前執行環體,UNTIL 執行.
例題:
; Display integers 1 – 10:
mov eax,0
.REPEAT
inc eax
call WriteDec
call Crlf
.UNTIL eax == 10
Web site
Examples
66
.WHILE 指令
在執行環體之前測試迴圈情況.ENDW 指令標示迴圈的結束.
例題:
; Display integers 1 – 10:
mov eax,0
.WHILE eax < 10
inc eax
call WriteDec
call Crlf
.ENDW
Web site
Examples
67
The End
Web site
Examples
68