1 / 28

條件處理

條件處理. CPU 旗標. 1. 結果為零,則設定零值旗標 。 2. 運算結果太大或太小, 設定 進位旗標 。 3. 符號旗標是目的運算元高位元的複製。 4. 運算為無效的結果, 設定 溢位旗標 。 5.當運算元中低位元組裡其值為 一的位元為偶數個時, 設定 同位旗標 就。. CPU 旗標. 當運算的 結果為零,則設定零值旗標 。 如: AX=1 時 SUB AX,1 ; AX=0 ; ZF=1. CPU 旗標. 當指令所產生的目的 運算元之結果太大或太小時,進位旗標 會被設定。 如: AX=0FFFFh

joelle
Télécharger la présentation

條件處理

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 條件處理

  2. CPU旗標 1. 結果為零,則設定零值旗標。 2. 運算結果太大或太小,設定進位旗標。 3.符號旗標是目的運算元高位元的複製。 4.運算為無效的結果,設定溢位旗標。 5.當運算元中低位元組裡其值為一的位元為偶數個時,設定同位旗標就。

  3. CPU旗標 當運算的結果為零,則設定零值旗標。 如: AX=1 時 SUB AX,1 ; AX=0 ; ZF=1

  4. CPU旗標 當指令所產生的目的運算元之結果太大或太小時,進位旗標會被設定。 如: AX=0FFFFh ADD AX, 1 ; AX=10000h ; CF=1

  5. CPU旗標 符號旗標是目的運算元高位元的複製,若符號旗標被設定表示為負,被清除則為正。 如: AX=01 MOV AX, 08000h ; AX=08000h ; SF=1

  6. CPU旗標 當指令產生無效的有號結果,則溢位旗標就會被設定。 如: AX=07FFFh ; >0 ADD AX,1h ; AX=08000h <0 ; OF=1

  7. CPU旗標 當指令造成目的運算元中低位元組裡其值為一的位元為偶數個時,同位旗標就會被設定。 如: AX=0A5A5H, AL=A5h=10100101 MOV AX,AX ; PF=1,偶數個1

  8. AND指令 • AND指令完成兩運算元中,相關對應位元間的AND布林運算(按位元的 ( bitwise ) )並且將結果存放於目的運算元 。

  9. AND指令(cont.) • 按位元的 ( bitwise ):相關對應位元間的運算 • 指令格式: AND 目的運算元,來源運算元 0100 0001 0110 0001 1110 0001

  10. 將字元轉換成大寫字母 • AND指令提供了一個簡單的方法將字母從小寫轉換成大寫。 • 大寫字母 (A,B,C,…Z)ASCII碼(41h,42h….) • 小寫字母 (a,b,c,…z)ASCII碼(61h,62h….) 41h0100 0001 61h0110 0001 AND mask1101 1111 61h and mask0100 0001=41h

  11. OR指令 • OR指令完成兩個運算元間,每對相對應位元的OR布林運算,並且將結果存放於目的運算元:指令格式: OR 目的運算元,來源運算元 61h0100 0001 41h0110 0001 OR mask0010 0000 41h OR mask0110 0001=61h

  12. XOR指令 • XOR指令完成兩運算元間相對應位元的互斥或(exclusive-OR)布林運算並且將結果存放於目的運算元。 指令格式: XOR 目的運算元,來源運算元

  13. 清除或設定個別CPU旗標(and, or) •  設定清除零旗標 and al,0 ;ZF=1 or al,1 ;ZF=0 •  設定清除符號旗標 or al,80h ;SF=1 and al,7Fh ;SF=0

  14. 清除或設定個別CPU旗標(設定、運算) • 設定清除進位旗標 stc ;CF=1 clc ;CF=0 • 設定清溢位旗標 mov al,7Fh inc al ;OF=1 or eax,0 ;OF=0

  15. 運算指令 條件成立? 是 否 條件跳越 • 根據運算結果更改程式流程, 提供此功能之指令稱條件跳越指令 • 一般應用條件跳越指令完成分支流程圖(基本條件結構)

  16. 運算指令 條件成立? 是 否 條件結構 • 在IA-32指令集中没有高階的邏輯結構,但無論多複雜的結構都能使用比較(comparisons)和跳越(jumps)的組合來完成。 cmp al,0 Jz L1 … … L1: and al,B0h Jnz L2 … … L2: CMP Jcond

  17. 條件成立? 是 否 Jcond指令 • 當旗標條件為true時條件跳越指令會分支到目的標號(destination label),若旗標條件為false時則會執行緊接在條件跳越之後的指令。 Jcond destination(是) ; 否

  18. Jcond指令(cont.) • 限制:要求跳越的目的地必須是現行程序內的標號,能以宣告全域標號(其後接::)來免除這個限制 • 跳越的範圍必須是下一個指令偏移量的-128到+127位元組內。 

  19. 運算指令 條件成立? 是 否 使用CMP指令 • 最常使用之運算指令為CMP (因為不會更改運算元數值) • 如: CMP AX,5 ; AX=5? JE L1 CMP AX,6 ; AX<6? JL L1 CMP AX,4 ; AX>4? JG L1

  20. 條件結構 • 區塊結構IF敘述 • IF (複合運算式) • WHILE迴圈

  21. 開始 運算式 敘述2 敘述1 結束 區塊結構IF敘述 if(運算式) 敘述列表1 else 敘述列表2 If (op1==op2) { X=1; Y=2; }

  22. 開始 運算式 敘述2 敘述1 結束 區塊結構IF敘述(cont.) 範例1 • 使用Java/C++語法, 如果 op1和op2相等則執行兩個指定敘述:  If (op1==op2) { X=1; Y=2; }

  23. CMASM MOV eax, op1 CMP eax, op2 JE L1 JMP L2 L1: mov X,1 mov Y,2 L2: If (op1==op2) { X=1; Y=2; }

  24. 開始 運算式 敘述2 敘述1 結束 複合運算式 • 右圖之運算式除基本之判斷運算外, 也可是多層級之複合運算式, 如: (a1>b1)AND (b1>c1) (a1>b1) OR (b1>c1)

  25. 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:

  26. 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不成立

  27. WHILE迴圈 • WHILE 結構在執行一區塊的敘述前會先測試一條件是否成立,只要條件保持成立那麼這些敘述就會重複執行這些敘述,以下的使用C++所寫的迴圈 while (val1<val2){ val1++; val2--; }

  28. WHILE迴圈(cont.) while (val1<val2) { val1++; val2--; } Mov eax, val1 while: CMP eax,val2 JNL endwhile INC eax DEC val2 JMP while endwhile: MOV val1, eax

More Related