操做 | 說明 |
---|---|
AND | 源操做數和目的操做數進行邏輯與操做 |
OR | 源操做數和目的操做數進行邏輯或操做 |
XOR | 源操做數和目的操做數進行邏輯異或操做 |
NOT | 對目標操做數進行邏輯非操做 |
TEST | 源操做數和目的操做數進行邏輯與操做,並適當地設置 CPU 標誌位 |
對 16 位整數來講,能夠經過將其高字節和低字節進行異或運算來檢測數的奇偶性:編程
mov ax,64Clh ;0110 0100 1100 0001 xor ah, al ;奇偶標誌位置1 (偶)
將每一個寄存器中的置 1 位(等於 1 的位)想象爲一個 8 位集合中的成員。XOR 指令把兩個集合交集中的成員清 0,並造成了其他位的並集。這個並集的奇偶性與整個 16 位整數的奇偶性相同。緩存
要將零標誌位清零,就把操做數與 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 ; 溢出標誌位清零
基於零標誌位、進位標誌位、溢出標誌位、奇偶標誌位和符號標誌位的跳轉。
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 |
助記符 | 說明 |
---|---|
JE | 相等跳轉 (leftOp=rightOp) |
JNE | 不相等跳轉 (leftOp M rightOp) |
JCXZ | CX=0 跳轉 |
JECXZ | ECX=0 跳轉 |
JRCXZ | RCX=0 跳轉(64 位模式) |
助記符 | 說明 | 助記符 | 說明 |
---|---|---|---|
JA | 大於跳轉(若 leftOp > rightOp) | JB | 小於跳轉(若 leftOp < rightOp) |
JNBE | 不小於或等於跳轉(與 JA 相同) | JNAE | 不大於或等於跳轉(與 JB 相同) |
JAE | 大於或等於跳轉(若 leftOp ≥ rightOp) | JBE | 小於或等於跳轉(若 leftOp ≤ rightOp) |
JNB | 不小於跳轉(與 JAE 相同) | JNA | 不大於跳轉(與 JBE 相同) |
助記符 | 說明 | 助記符 | 說明 |
---|---|---|---|
JG | 大於跳轉(若 leftOp > rightOp) | JL | 小於跳轉(若 leftOp < rightOp) |
JNLE | 不小於或等於跳轉(與 JG 相同) | JNGE | 不大於或等於跳轉(與 JL 相同) |
JGE | 大於或等於跳轉(若 leftOp ≥ rightOp) | JLE | 小於或等於跳轉(若 leftOp ≤ rightOp) |
JNL | 不小於跳轉(與 JGE 相同) | JNG | 不大於跳轉(與 JLE 相同) |
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