條件處理
CPU旗標 1. 結果為零,則設定零值旗標。 2. 運算結果太大或太小,設定進位旗標。 3.符號旗標是目的運算元高位元的複製。 4.運算為無效的結果,設定溢位旗標。 5.當運算元中低位元組裡其值為一的位元為偶數個時,設定同位旗標就。
CPU旗標 當運算的結果為零,則設定零值旗標。 如: AX=1 時 SUB AX,1 ; AX=0 ; ZF=1
CPU旗標 當指令所產生的目的運算元之結果太大或太小時,進位旗標會被設定。 如: AX=0FFFFh ADD AX, 1 ; AX=10000h ; CF=1
CPU旗標 符號旗標是目的運算元高位元的複製,若符號旗標被設定表示為負,被清除則為正。 如: AX=01 MOV AX, 08000h ; AX=08000h ; SF=1
CPU旗標 當指令產生無效的有號結果,則溢位旗標就會被設定。 如: AX=07FFFh ; >0 ADD AX,1h ; AX=08000h <0 ; OF=1
CPU旗標 當指令造成目的運算元中低位元組裡其值為一的位元為偶數個時,同位旗標就會被設定。 如: AX=0A5A5H, AL=A5h=10100101 MOV AX,AX ; PF=1,偶數個1
AND指令 AND指令完成兩運算元中,相關對應位元間的AND布林運算(按位元的 ( bitwise ) )並且將結果存放於目的運算元 。
AND指令(cont.) 按位元的 ( bitwise ):相關對應位元間的運算 指令格式: AND 目的運算元,來源運算元 0100 0001 0110 0001 1110 0001
將字元轉換成大寫字母 AND指令提供了一個簡單的方法將字母從小寫轉換成大寫。 大寫字母 (A,B,C,…Z)ASCII碼(41h,42h….) 小寫字母 (a,b,c,…z)ASCII碼(61h,62h….) 41h0100 0001 61h0110 0001 AND mask1101 1111 61h and mask0100 0001=41h
OR指令 OR指令完成兩個運算元間,每對相對應位元的OR布林運算,並且將結果存放於目的運算元: 指令格式: OR 目的運算元,來源運算元 61h0100 0001 41h0110 0001 OR mask0010 0000 41h OR mask0110 0001=61h
XOR指令 XOR指令完成兩運算元間相對應位元的互斥或(exclusive-OR)布林運算並且將結果存放於目的運算元。 指令格式:
清除或設定個別CPU旗標(and, or) 設定清除零旗標 and al,0 ;ZF=1 or al,1 ;ZF=0 設定清除符號旗標 設定清除零旗標 and al,0 ;ZF=1 or al,1 ;ZF=0 設定清除符號旗標 or al,80h ;SF=1 and al,7Fh ;SF=0
清除或設定個別CPU旗標 (設定、運算) 設定清除進位旗標 stc ;CF=1 clc ;CF=0 設定清溢位旗標 mov al,7Fh inc al ;OF=1 or eax,0 ;OF=0
條件跳越 根據運算結果更改程式流程, 提供此功能之指令稱條件跳越指令 一般應用條件跳越指令完成分支流程圖(基本條件結構) 運算指令 是 條件成立? 是 否
條件結構 在IA-32指令集中没有高階的邏輯結構,但無論多複雜的結構都能使用比較(comparisons)和跳越(jumps)的組合來完成。 運算指令 條件成立? 是 否 CMP cmp al,0 Jz L1 … L1: and al,B0h Jnz L2 … L2: Jcond
Jcond指令 當旗標條件為true時條件跳越指令會分支到目的標號(destination label),若旗標條件為false時則會執行緊接在條件跳越之後的指令。 條件成立? 是 否 Jcond destination(是) ; 否
Jcond指令(cont.) 限制:要求跳越的目的地必須是現行程序內的標號,能以宣告全域標號(其後接::)來免除這個限制 跳越的範圍必須是下一個指令偏移量的-128到+127位元組內。
使用CMP指令 最常使用之運算指令為CMP (因為不會更改運算元數值) 如: 運算指令 是 條件成立? 否 CMP AX,5 ; AX=5? JE L1 CMP AX,6 ; AX<6? JL L1 CMP AX,4 ; AX>4? JG L1
條件結構 區塊結構IF敘述 IF (複合運算式) WHILE迴圈
區塊結構IF敘述 if(運算式) 敘述列表1 else 敘述列表2 結束 開始 運算式 敘述1 敘述2 If (op1==op2) { X=1; Y=2; }
區塊結構IF敘述(cont.) 範例1 使用Java/C++語法, 如果 op1和op2相等則執行兩個指定敘述: 開始 運算式 敘述1 敘述2 結束 範例1 使用Java/C++語法, 如果 op1和op2相等則執行兩個指定敘述: If (op1==op2) { X=1; Y=2; }
CMASM MOV eax, op1 CMP eax, op2 JE L1 JMP L2 If (op1==op2) L1: { mov X,1 mov Y,2 L2: If (op1==op2) { X=1; Y=2; }
複合運算式 右圖之運算式除基本之判斷運算外, 也可是多層級之複合運算式, 如: (a1>b1)AND (b1>c1) (a1>b1) OR (b1>c1) 開始 運算式 敘述1 敘述2 結束
AND邏輯運算子 If(a1>b1)AND(b1>c1) 第一個運算式 第二個運算式 CMP al, bl JA L1 JMP NEXT L1: CMP bl, cl JA L2 JMP NEXT L2: mov X,1 Next:
OR邏輯運算子 If(a1>b1)OR(b1>c1) 第一個運算式 第二個運算式 CMP al, bl JA L1 CMP bl, cl JBE NEXT L1: mov X,1 Next: (below equal) =JA不成立
WHILE迴圈 WHILE 結構在執行一區塊的敘述前會先測試一條件是否成立,只要條件保持成立那麼這些敘述就會重複執行這些敘述,以下的使用C++所寫的迴圈 while (val1<val2){ val1++; val2--; }
WHILE迴圈(cont.) while (val1<val2) { val1++; val2--; } Mov eax, val1 CMP eax,val2 JNL endwhile INC eax DEC val2 JMP while endwhile: MOV val1, eax