日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Win32ASM学习[11]:逻辑运算

發布時間:2023/12/1 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Win32ASM学习[11]:逻辑运算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ---------------------------------------------------------------------------------------------------------------------------?

一.邏輯與運算指令 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

總結

以上是生活随笔為你收集整理的Win32ASM学习[11]:逻辑运算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。