一.邏輯與運算指令 AND
?格式: AND OPRD1,OPRD2其中目的操作數OPRD1為任一通用寄存器或存儲器操作數.源操作數OPRD2為立即數、任一通用寄存器或存儲器操作數.
?功能: 對兩個操作數實現按位邏輯與運算,結果送至目的操作數.本指令可以進行字節或字
?的‘與’運算.OPRD1<--OPRD1 and OPRD2.
?說明: 1. 例如: AND AL,0FH?????????? ; (AL)<--(AL) AND 0FH?
?????????????????????AND AX,BX??????????? ; (AX)<--(AX) AND (BX)?
?????????????????????AND DX,BUFFER[SI+BX]?
?????????????????????AND BETA[BX],00FFH
?????? 2. 本指令影響標志位PF、SF、ZF,使CF=0、OF=0.
?????????? 例如,在同一個通用寄存器自身相與時,操作數雖不變,但使CF置零.本指令主要用于修改操作數或置某些位為零.
?????? 3. 上例中的每一條指令,將使AL寄存器的高4位置成零保持AL低4位值不變.
?????? 4. 兩數相與,有一個數假則值為假
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
and小寫轉換大寫
.data
??? szText db 'Delphi', 0
.code
main proc
??????? ?lea esi, szText
???????? mov ecx, lengthof szText - 1
@@:? and byte ptr [esi], 11011111b?? ;大寫字母和小寫字母只有第五位不同
?????????inc esi
???????? loop @B
???????? PrintString szText ;DELPHI
???????? ret
main endp
end main
-------------------------------------------------------------------------------------------------------------------------
邏輯或指令 OR
?格式: OR OPRD1,OPRD2
?功能: 其中OPRD1、OPRD2含義與AND指令相同, 對標志位的影響也與AND指令相同.唯一不同的地方是,OR指令完成對兩個操作數按位的‘或’運算,結果送至目的操作數中,?本指令可以進行字節或字的‘或’運算.
?????? OPRD1<--OPRD1 OR OPRD2.
;該指令會置 CF=OF=0; 其結果影響 SF、ZF、PF
;指令格式:
OR r/m, r/m/i
說明: 兩數相或,有一個數為真則值為真
?
or 轉小寫
.data
??? szText db'Delphi', 0
.code
main proc
????????? lea? esi, szText??
??????? ?movecx,lengthof szText - 1
@@:? or byte ptr [esi], 00100000b??? ;大寫字母和小寫字母只有第五位不同
???????? inc? esi
???????? loop @B
???????? PrintString szText ;delphi
???????? ret
main endp
end main
---------------------------------------------------------------------------------------------------------------------------
邏輯異或運算指令 XOR
格式: XOR OPRD1,OPRD2
功能: 其在OPRD1、OPRD2的含義與AND指令相同,對標志位的影響與與AND指令相同.本指令的功能是實現兩個操作數按位‘異或’運算,結果送至目的操作數中.它可以進行字節或字的‘異或’運算.OPRD1<--OPRD1 XOR OPRD2
;該指令會置 CF=OF=0; 其結果影響 SF、ZF、PF
;指令格式:
XOR r/m, r/m/i
兩次和一個相同的數 XOR 恢復到原來的數
.data
??? szText db 'Hello World!', 0
.code
main proc
?????? ?;加密
????????lea???? esi, szText
????? ? mov? ecx, lengthof szText - 1
@@: xor byte? ptr [esi], 123 ;使用 123 做密碼
?????? ?inc?? esi
??????? loop @B
??????? PrintString szText???? ;顯示亂碼
???
?????? ;解密
?????? ?lea esi, szText
????????mov? ecx, lengthof szText - 1
@@: xor byte? ptr [esi], 123
??????? inc? esi
??????? loop @B
??????? PrintString szText???? ;Hello World!
??????? ret
main endp
end main
----------------------------------------------------------------------------------------------------------------------------------
not
;該指令不影響 EFlags
;指令格式:
NOT r/m
.data
??? szText db 'Hello World!', 0
.code
main proc
??????? ;加密
??????? lea esi, szText
??????? mov ecx, lengthof szText - 1
@@: not? byte? ptr [esi]
??????? inc? esi
??????? loop @B
??????? PrintString szText ;顯示亂碼
???
??????? ;解密
??????? leaesi, szText
??????? mov? ecx, lengthof szText - 1
@@: notbyte ptr [esi]
?????? ?inc esi
?????? ?loop @B
????? ? PrintString szText ;Hello World!
????? ? ret
main endp
end main
-----------------------------------------------------------------------------------------------------------------
測試指令 TEST
格式: TEST OPRD1,OPRD2?
功能: 其中OPRD1、OPRD2的含義同AND指令一樣,也是對兩個操作數進行按位的‘與’運算? ,唯一不同之處是不將‘與’的結果送目的操作數,即本指令對兩個操作數的內容均不進行修改,僅是在邏輯與操作后,對標志位重新置位.
說明: TEST與AND指令的關系,有點類似于CMP與SUB指令之間的關系.
?
;判斷字母 A 二進制(01000001)的其最后一位是否是 0, 如果是 0 那么 ZF=1
??? mov? al, 'A'
??? test al, 00000001b
??? lahf
??? PrintHex ah ;02 - 00000010b (ZF=0)
;判斷 ecx 是否為空
??? mov ecx, 1
??? test ecx,ecx
??? lahf
? PrintHex ah ;06 - 00000010b (ZF=0, 不為空)
??? xor? ecx,ecx
??? test ecx, ecx
??? lahf
??? PrintHex ah ;06 - 01000110b (ZF=1, 為空)
------------------------------------------------------------------------------
判斷字符串中每個字符的二進制位的最后一位是 1 還是 0
------------------------------------------------------------------------------
.data
??? szText db 'Delphi', 0
.code
main proc
?? ;清空兩個寄存器用于計數
??? xor? eax, eax
??? xor? edx, edx
???
?? ? lea esi, szText??? ??? ??? ??? ;字符串地址
??? ?mov? ecx, lengthof szText - 1?? ;字符串長度
L1: test byte ptr [esi], 00000001b ;循環測試每個字符的最后一位是 1 還是 0
????? jz L2?? ;如果是 0 則跳到 L2 給 edx+1
??? ? inc eax ;反之給 eax+1
???? ?jmp L3
L2: inc?? edx
L3: inc?? esi
??????loop L1
???
???? PrintDec eax ;2 - 這是最后一位是 1 的字符的個數: e、i
???? PrintDec edx ;4 - 這是最后一位是 0 的字符的個數: D、l、p、h
??? ?ret
main endp