汇编语言MOVZX和MOVSX指令
盡管 MOV 指令不能直接將較小的操作數(shù)復(fù)制到較大的操作數(shù)中,但是程序員可以想辦法解決這個問題。假設(shè)要將 count(無符號,16 位)傳送到 ECX(32 位),可以先將 ECX 設(shè)置為 0,然后將 count 傳送到 CX:
?
.data count WORD 1 .code mov ecx,0 mov cx,count如果對一個有符號整數(shù) -16 進(jìn)行同樣的操作會發(fā)生什么呢?
.data signedVal SWORD -16 ; FFF0h (-16) .code mov ecx,0 mov cx,signedVal ; ECX = 0000FFF0h(+ 65,52 0)ECX 中的值(+65 520)與 -16 完全不同。但是,如果先將 ECX 設(shè)置為 FFFFFFFFh,然后再把 signedVal 復(fù)制到 CX,那么最后的值就是完全正確的:
mov ecx,0FFFFFFFFh mov cx,signedVal ;ECX = FFFFFFF0h(-16)本例的有效結(jié)果是用源操作數(shù)的最高位(1)來填充目的操作數(shù) ECX 的高 16 位,這種技術(shù)稱為符號擴(kuò)展(sign extension)。當(dāng)然,不能總是假設(shè)源操作數(shù)的最高位是 1。幸運(yùn)的是,Intel 的工程師在設(shè)計指令集時已經(jīng)預(yù)見到了這個問題,因此,設(shè)置了 MOVZX 和 MOVSX 指令來分別處理無符號整數(shù)和有符號整數(shù)。
MOVZX 指令
MOVZX 指令(進(jìn)行全零擴(kuò)展并傳送)將源操作數(shù)復(fù)制到目的操作數(shù),并把目的操作數(shù) 0 擴(kuò)展到 16 位或 32 位。這條指令只用于無符號整數(shù),有三種不同的形式:
MOVZX reg32,reg/mem8
MOVZX reg32,reg/mem16
MOVZX reg16,reg/mem8
在三種形式中,第一個操作數(shù)(寄存器)是目的操作數(shù),第二個操作數(shù)是源操作數(shù)。注意,源操作數(shù)不能是常數(shù)。下例將二進(jìn)制數(shù) 1000 1111 進(jìn)行全零擴(kuò)展并傳送到 AX:
.data byteVal BYTE 10001111b .code movzx ax,byteVal ;AX = 0000000010001111b下圖展示了如何將源操作數(shù)進(jìn)行全零擴(kuò)展,并送入 16 位目的操作數(shù)。
下面例子的操作數(shù)是各種大小的寄存器:
mov bx, 0A69Bh movzx eax, bx ;EAX = 0000A69Bh movzx edx, bl ;EDX = 0000009Bh movzx cx, bl ;CX = 009Bh下面例子的源操作數(shù)是內(nèi)存操作數(shù),執(zhí)行結(jié)果是一樣的:
.data byte1 BYTE 9Bh word1 WORD 0A69Bh .code movzx eax, word1 ;EAX = 0000A69Bh movzx edx, byte1 ;EDX = 0000009Bh movzx ex, byte1 ;CX = 009BhMOVSX 指令
MOVSX 指令(進(jìn)行符號擴(kuò)展并傳送)將源操作數(shù)內(nèi)容復(fù)制到目的操作數(shù),并把目的操作數(shù)符號擴(kuò)展到 16 位或 32 位。這條指令只用于有符號整數(shù),有三種不同的形式:
MOVSX reg32, reg/mem8
MOVSX reg32, reg/mem16
MOVSX reg16, reg/mem8
操作數(shù)進(jìn)行符號擴(kuò)展時,在目的操作數(shù)的全部擴(kuò)展位上重復(fù)(復(fù)制)長度較小操作數(shù)的最高位。下面的例子是將二進(jìn)制數(shù) 1000 1111b 進(jìn)行符號擴(kuò)展并傳送到 AX:
.data byteVal BYTE 10001111b .code movsx ax,byteVal ;AX = 1111111110001111b如下圖所示,復(fù)制最低 8 位,同時,將源操作數(shù)的最高位復(fù)制到目的操作數(shù)高 8 位的每一位上。
如果一個十六進(jìn)制常數(shù)的最大有效數(shù)字大于 7,那么它的最高位等于 1。如下例所示,傳送到 BX 的十六進(jìn)制數(shù)值為 A69B,因此,數(shù)字“A”就意味著最高位是 1。(A69B 前面的 0 是一種方便的表示法,用于防止匯編器將常數(shù)誤認(rèn)為標(biāo)識符。)
4.1?操作數(shù)類型
4.2?MOV指令
4.3?MOVZX和MOVSX指令
4.4?LAHF和SAHF指令
4.5?XCHG指令
4.6?直接偏移量操作數(shù)
4.7?匯編語言數(shù)據(jù)傳送示例
4.8?加法和減法詳解
4.9?OFFSET運(yùn)算符
4.10?ALIGN偽指令
4.11?PTR運(yùn)算符
4.12?TYPE運(yùn)算符
4.13?LENGTHOF運(yùn)算符
4.14?LABEL偽指令
4.15?間接尋址
4.16?JMP和LOOP指令
4.17?64位MOV指令
4.18?64位加法和減法
總結(jié)
以上是生活随笔為你收集整理的汇编语言MOVZX和MOVSX指令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux之间安全传输文件,使用SCP安
- 下一篇: 汇编语言LAHF和SAHF指令