第六章 條件處理

6.1 布爾和比較指令

 

操做 說明
AND 源操做數和目的操做數進行邏輯與操做
OR 源操做數和目的操做數進行邏輯或操做
XOR 源操做數和目的操做數進行邏輯異或操做
NOT 對目標操做數進行邏輯非操做
TEST 源操做數和目的操做數進行邏輯與操做,並適當地設置 CPU 標誌位

 6.2.4 XOR指令

對 16 位整數來講,能夠經過將其高字節和低字節進行異或運算來檢測數的奇偶性:編程

mov ax,64Clh    ;0110 0100 1100 0001
xor ah, al            ;奇偶標誌位置1 (偶)

將每一個寄存器中的置 1 位(等於 1 的位)想象爲一個 8 位集合中的成員。XOR 指令把兩個集合交集中的成員清 0,並造成了其他位的並集。這個並集的奇偶性與整個 16 位整數的奇偶性相同。緩存

 

6.2.8 設置和清除單個CPU狀態標誌

要將零標誌位清零,就把操做數與 1 進行 OR 操做:oop

test al, 0           ;零標誌位置 1
and al, 0           ;零標誌位置 1
or al, 1              ;零標誌位清零

TEST 指令不修改目的操做數,而 AND 指令則會修改目的操做數。若要符號標誌位置 1,將操做數的最高位和 1 進行 OR 操做;若要清除符號標誌位,則將操做數最高位和 0 進行 AND 操做:加密

or al, 80h         ;符號標誌位置 1
and al, 7Fh       ;符號標誌位清零

若要進位標誌位置 1,用 STC 指令;清除進位標誌位,用 CLC 指令:spa

stc                   ;進位標誌位置 1
clc                   ;進位標誌位清零

若要溢出標誌位置 1,就把兩個正數相加使之產生負的和數;若要清除溢出標誌位,則將操做數和 0 進行 OR 操做:code

mov al,7Fh       ; AL = +127
inc al                ; AL = 80h (-128), OF=1
or eax, 0           ; 溢出標誌位清零

 

6.3 條件跳轉

1.基於特定CPU標誌值的跳轉指令

基於零標誌位、進位標誌位、溢出標誌位、奇偶標誌位和符號標誌位的跳轉。

blog

 

助記符 說明 標誌位/寄存器 助記符 說明 標誌位/寄存器
JZ 爲零跳轉 ZF=1 JNO 無溢出跳轉 OF=0
JNZ 非零跳轉 ZF=0 JS 有符號跳轉 SF=1
JC 進位跳轉 CF=1 JNS 無符號跳轉 SF=0
JNC 無進位跳轉 CF=0 JP 偶校驗跳轉 PF=1
JO 溢出跳轉 OF=1 JNP 奇校驗跳轉 PF=0

 2.恆等性比較

助記符 說明
JE 相等跳轉 (leftOp=rightOp)
JNE 不相等跳轉 (leftOp M rightOp)
JCXZ CX=0 跳轉
JECXZ ECX=0 跳轉
JRCXZ RCX=0 跳轉(64 位模式)

3.無符號數比較

助記符 說明 助記符 說明
JA 大於跳轉(若 leftOp > rightOp) JB 小於跳轉(若 leftOp < rightOp)
JNBE 不小於或等於跳轉(與 JA 相同) JNAE 不大於或等於跳轉(與 JB 相同)
JAE 大於或等於跳轉(若 leftOp ≥ rightOp) JBE 小於或等於跳轉(若 leftOp ≤ rightOp)
JNB 不小於跳轉(與 JAE 相同) JNA 不大於跳轉(與 JBE 相同)

 

4.有符號數比較

助記符 說明 助記符 說明
JG 大於跳轉(若 leftOp > rightOp) JL 小於跳轉(若 leftOp < rightOp)
JNLE 不小於或等於跳轉(與 JG 相同) JNGE 不大於或等於跳轉(與 JL 相同)
JGE 大於或等於跳轉(若 leftOp ≥ rightOp) JLE 小於或等於跳轉(若 leftOp ≤ rightOp)
JNL 不小於跳轉(與 JGE 相同) JNG 不大於跳轉(與 JLE 相同)

 

6.9編程練習

2.循環的實現ip

TITLE TEST PROJECT 

INCLUDE Irvine32.inc

.data
    array DWORD 10,60,20,33,72,89,56,65,72,18
    sample DWORD 50
    ArraySize DWORD LENGTHOF array
    index DWORD 0
    sum DWORD 0

.code
main PROC
    mov esi,ArraySize
    mov ebx,index
    mov edx,sample
    mov eax,sum
    .WHILE ebx < esi
    .IF array[ebx*TYPE array] <= edx
    add eax,array[ebx*TYPE array]
    mov sum,eax
    .ENDIF
    inc ebx
    .ENDW
    call WriteInt
    call DumpRegs
    call WaitMsg
    exit
main ENDP
END main

 

3.測驗分數的評級(1)字符串

TITLE TEST PROJECT 

INCLUDE Irvine32.inc

.data
    Msg BYTE 'Please input grade(0~100):',0
    Class BYTE 'A','B','C','D','F'

.code
main PROC
    mov edx,OFFSET Msg
    call WriteString
    call ReadDec
    .IF eax >= 90 && eax <= 100
        mov al,Class[0]
    .ELSEIF eax >= 80 && eax <= 89
        mov al,Class[1]
    .ELSEIF eax >= 70 && eax <= 79
        mov al,Class[2]
    .ELSEIF eax >= 60 && eax <= 69
        mov al,Class[3]
    .ELSEIF eax >= 0 && eax <= 59
        mov al,Class[4]
    .ENDIF
    call WriteChar
    call WaitMsg
    exit
main ENDP
END main

 

4.3.測驗分數的評級(2)input

TITLE TEST PROJECT 

INCLUDE Irvine32.inc

.data
    Msg BYTE 'Please input grade(0~100):',0
    Class BYTE 'A','B','C','D','F'
    Warning BYTE 'Input beyond range!',0


.code
main PROC
    .WHILE 1
        mov edx,OFFSET Msg
        call WriteString
        call ReadDec
        .IF eax >= 90 && eax <= 100
            mov al,Class[0]
        .ELSEIF eax >= 80 && eax <= 89
            mov al,Class[1]
        .ELSEIF eax >= 70 && eax <= 79
            mov al,Class[2]
        .ELSEIF eax >= 60 && eax <= 69
            mov al,Class[3]
        .ELSEIF eax >= 0 && eax <= 59
            mov al,Class[4]
        .ELSE
            mov edx,OFFSET Warning
            call WriteString
            jmp S
        .ENDIF
        call WriteChar
    S:
        call Crlf
        call WaitMsg
        call Clrscr
    .ENDW
    exit
main ENDP
END main

 

7.布爾計算器(1)

TITLE TEST PROJECT 

INCLUDE Irvine32.inc

.data
Info1 BYTE '(1)x AND y',13,10,
           '(2)x OR y',13,10,
           '(3)NOT x',13,10,
           '(4)x XOR y',13,10,
           '(5)Exit program',0
Ch1 BYTE 'AND',0
Ch2 BYTE 'OR',0
Ch3 BYTE 'AND',0
Ch4 BYTE 'AND',0
Ch5 BYTE 'Exit',0
Other BYTE 'Input error!',0
.code
main PROC
    mov edx,OFFSET Info1
    call WriteString
    call Crlf
    call ReadDec
    .IF eax == 1
        mov edx,OFFSET Ch1
        call WriteString
    .ELSEIF eax == 2
        mov edx,OFFSET Ch2
        call WriteString
    .ELSEIF eax == 3
        mov edx,OFFSET Ch3
        call WriteString
    .ELSEIF eax == 4
        mov edx,OFFSET Ch4
        call WriteString
    .ELSEIF eax == 5
        mov edx,OFFSET Ch5
        call WriteString
    .ELSE
        mov edx,OFFSET Other
        call WriteString
    .ENDIF
    call Crlf
    call WaitMsg
    exit
main ENDP
END main

 

8.布爾計算器(2)

TITLE TEST PROJECT 

INCLUDE Irvine32.inc

.data
Info1 BYTE '(1)x AND y',13,10,
           '(2)x OR y',13,10,
           '(3)NOT x',13,10,
           '(4)x XOR y',13,10,
           '(5)Exit program',0
Choosex BYTE 'Input x:',0
Choosey BYTE 'Input y:',0
Ch5 BYTE 'Exit',0
Other BYTE 'Input error!',0
.code
main PROC
    ;菜單
    mov edx,OFFSET Info1
    call WriteString
    call Crlf
    ;讀取選擇
    call ReadDec
    ;退出
    .IF eax == 5
        mov edx,OFFSET Ch5
        call WriteString
        jmp S
    ;超出選擇範圍
    .ELSEIF eax < 1 || eax > 5
        mov edx,OFFSET Other
        call WriteString
        jmp S
    .ENDIF
    push eax
    ;輸入x
    mov edx,OFFSET Choosex
    call WriteString
    call ReadHex
    mov ebx,eax
    pop eax
    ;是否須要輸入y
    .IF eax != 3
        push eax
        mov edx,OFFSET Choosey
        call WriteString
        call ReadHex
        mov edx,eax
        pop eax
    .ENDIF
    ;根據選擇進行操做
    .IF eax == 1
        and ebx,edx
    .ELSEIF eax == 2
        or ebx,edx
    .ELSEIF eax == 3
        not ebx
    .ELSEIF eax == 4
        xor ebx,edx
    .ENDIF
    ;顯示結果
    mov eax,ebx
    call WriteHex
S:
    call Crlf
    call WaitMsg
    exit
main ENDP
END main

 

9.自定義祕鑰輸入

TITLE Encryption Program

INCLUDE Irvine32.inc

KEYMAX = 128
BUFMAX = 128

.data
sPrompt BYTE "Enter the plain text:",0
sKey BYTE "Enter the Key:",0
sEncrypt BYTE "Cipher text:",0
sDecrypt BYTE "Decrypted:",0
key BYTE KEYMAX+1 DUP(0)
buffer BYTE BUFMAX+1 DUP(0)
KeySize DWORD ?
BufSize DWORD ?

.code
main PROC
    call InputTheStringAndKey
    call TranslateBuffer
    mov edx,OFFSET sEncrypt
    call DisplayMessage
    call TranslateBuffer
    mov edx,OFFSET sDecrypt
    call DisplayMessage
    
    call WaitMsg
    exit
main ENDP

InputTheStringAndKey PROC
    pushad
    ;待加密字符串輸入提示
    mov edx,OFFSET sPrompt
    call WriteString
    ;輸入讀入緩存
    mov ecx,BUFMAX
    mov edx,OFFSET buffer
    call ReadString
    ;更新待加密字符串長度
    mov BufSize,eax
    call Crlf
    ;密鑰輸入提示
    mov edx,OFFSET sKey
    call WriteString
    ;輸入讀入緩存
    mov ecx,KEYMAX
    mov edx,OFFSET key
    call ReadString
    ;更新密鑰長度
    mov KeySize,eax
    call Crlf
    popad
    ret
InputTheStringAndKey ENDP

DisplayMessage PROC
    pushad
    ;輸出提示字符串
    call WriteString
    ;輸出緩存區內容
    mov edx,OFFSET buffer
    call WriteString
    call Crlf
    call Crlf
    popad
    ret
DisplayMessage ENDP

TranslateBuffer PROC
    pushad
    mov ecx,BufSize
    mov esi,0
    mov edi,0
    ;外部循環--待加密字符串
Li:
    push ecx
    mov ecx,KeySize
    ;內部循環--密鑰
Li2:
    mov al,key[edi]
    xor buffer[esi],al
    inc esi
    loop Li2

    pop ecx
    loop Li
    popad
    ret
TranslateBuffer ENDP
END main
相關文章
相關標籤/搜索