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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Win32ASM学习[10]:传送指令

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

匯編指令的一般性要求: 1、兩個操作數的尺寸必須一致; 2、操作數不能同為內存.
---------------------------------------------------------------------------------------------------------------

;mov

;該指令不影響 EFlags
;指令格式: (其中的 r、m、i 分別表示: 寄存器、內存、立即數)
mov?r/m, r/m/i

?

??? mov val, 123
??? mov? edx
, val
??? mov? eax, edx

??? PrintDec edx????? ;123

---------------------------------------------------------------------------------------------------------------

Lea

;該指令不影響 EFlags
;指令格式:
LEA r, m

?

.data
??? szText db 'ABCDEFG', 0
.code
main
proc
??? lea eax
, offset szText
??? lea ebx, szText
??? PrintHex eax ;00403000
??? PrintHex ebx ;00403000
??? ret
main
endp
end
main

讓我感到比較困惑的是?? lea 的那條居然會輸出地址? - -

---------------------------------------------------------------------------------------------------------------

XCHG(Exchange): 交換指令

?數據交換指令 XCHG

?格式: XCHG OPRD1,OPRD2 其中的OPRD1為目的操作數,OPRD2為源操作數

?功能: 將兩個操作數相互交換位置,該指令把源操作數OPRD2與目的操數OPRD1交換.

?說明: 1. OPRD1及OPRD2可為通用寄存器或存儲器,但是兩個存儲器之間是不能用XCHG指令? ----???? 實現的.

?????? 2. 段寄存器內容不能用XCHG指令來交換.

????????? 示例: XCHG AX,BX
??????????????? XCHG SI,AX
??????????????? XCHG CL,CH
??????????????? XCHG DX,BUFFER
??????????????? XCHG CH,DATA2[SI]
??????????????? SCHG WORDA,CX
?
?????? 3. 若要實現兩個存儲器操作數DATA1及DATA2的交換,可用以下指令實現:
????????? 示例: PUSH DATA1
??????????????????PUSH DATA2
??????????????? ? POP DATA1
???????????????? ?POP DATA2

????????? 注意: 此處通過中間寄存器,也很容易實現兩個存儲器操作數的交換.

?????? 4. 本指令不影響狀態標志位.

XCHG r/m, r/m

---------------------------------------------------------------------------------------------------------------

XLATB(Translate Byte)、XLAT(Translate): 換碼指令

查表指令 XLAT/XLATB
?
?格式: XLAT TABLE 其中TABLE為一待查表格的首地址.
?----? XLATB TABLE 其中TABLE為一待查表格的首地址.????
?功能: 把待查表格的一個字節內容送到AL累加器中.在執行該指令前,應將 TABLE先送至BX? ----? 寄存器中,然后將待查節節與在表格中距表首地址位移量送AL,即 (AL)<--((BX)+(AL)).

;XLATB 可簡化為 XLAT
;該指令不影響 EFlags
;XLAT 無參數, 操作和 EBX、AL 相關
;執行 XLAT 前, 先把源地址放入 EBX, 把字節序號放入 AL
;執行后, 指定字節被讀入 AL

?

.data
??? szText db 'ABCDEFG', 0
.code
main
proc
??? lea ebx
, szText

? ? mov al, 1
??? xlat
???

??? PrintHex al ;42 - 這是 'B' 的 ASSII 編碼
???
??? mov al
, 2

??? xlatb

??? PrintHex al ;43 - 這是 'C' 的 ASSII 編碼
??? ret
main
endp
end
main

---------------------------------------------------------------------------------------------------------------

MOVSX 指令

格式: MOVSX OPD,OPS

功能: 將8位或16位的OPS符號擴展為16位或32位, 再傳給OPD.所謂的符號擴展, 就是當??? ----? 把一個字節擴展為字或是一字擴展為雙字時,高位字節的各位和原數最高位相同,這??????? 可以保證原來用補碼表示的數值不變.這條指令一般用于帶符號數的擴展.

如果源操作數的最高位是 1, MOVSX 會將目標寄存器中高出的位補 1; 反之補 0

說明: 指令舉例

1. MOVSX EAX ,BX????
2. MOVSX ECX,CL????
3. MOVSX DX,DL

?

.data
??? bVal?? db 90h
??? dwVal1 dw 7FFFh
??? dwVal2 dw 8000h
.code
main proc
??? movzx eax, dwVal1
??? movsx edx, dwVal1
??? PrintHex eax ;00007FFF
??? PrintHex edx ;00007FFF
???
??? movzx eax, dwVal2
??? movsx edx, dwVal2
??? PrintHex eax ;00008000
??? PrintHex edx ;FFFF8000
???
??? mov cl, bVal
??? movzx ax, cl
??? movsx dx, cl
??? PrintHex ax? ;0090
??? PrintHex dx? ;FF90
??? ret
main endp
end main
-------------------------------------------------------------------------------------------------------------------------------


總結

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

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