組合語言MOVZX和MOVSX指令

2021-09-24 16:40:01 字數 2476 閱讀 7724

儘管 mov 指令不能直接將較小的運算元複製到較大的運算元中,但是程式設計師可以想辦法解決這個問題。假設要將 count(無符號,16 位)傳送到 ecx(32 位),可以先將 ecx 設定為 0,然後將 count 傳送到 cx:

.data  count word 1  .code  mov ecx,0  mov cx,count
如果對乙個有符號整數 -16 進行同樣的操作會發生什麼呢?

.data  signedval sword -16      ; fff0h (-16)  .code  mov ecx,0  mov cx,signedval         ; ecx = 0000fff0h(+ 65,52 0)
ecx 中的值(+65 520)與 -16 完全不同。但是,如果先將 ecx 設定為 ffffffffh,然後再把 signedval 複製到 cx,那麼最後的值就是完全正確的:

mov ecx,0ffffffffh  mov cx,signedval    ;ecx = fffffff0h(-16)
本例的有效結果是用源運算元的最高位(1)來填充目的運算元 ecx 的高 16 位,這種技術稱為符號擴充套件(sign extension)。當然,不能總是假設源運算元的最高位是 1。幸運的是,intel 的工程師在設計指令集時已經預見到了這個問題,因此,設定了 movzx 和 movsx 指令來分別處理無符號整數和有符號整數。

movzx 指令(進行全零擴充套件並傳送)將源運算元複製到目的運算元,並把目的運算元 0 擴充套件到 16 位或 32 位。這條指令只用於無符號整數,有三種不同的形式:

movzx reg32,reg/mem8

movzx reg32,reg/mem16

movzx reg16,reg/mem8

在三種形式中,第乙個運算元(暫存器)是目的運算元,第二個運算元是源運算元。注意,源運算元不能是常數。下例將二進位制數 1000 1111 進行全零擴充套件併發送到 ax:

.data  byteval byte 10001111b  .code  movzx ax,byteval ;ax = 0000000010001111b
下圖展示了如何將源運算元進行全零擴充套件,並送入 16 位目的運算元。

下面例子的運算元是各種大小的暫存器:

mov bx, 0a69bh  movzx eax, bx     ;eax = 0000a69bh  movzx edx, bl     ;edx = 0000009bh  movzx cx, bl     ;cx = 009bh
下面例子的源運算元是記憶體運算元,執行結果是一樣的:

.data  byte1 byte  9bh  word1 word 0a69bh  .code  movzx eax, word1 ;eax = 0000a69bh  movzx edx, byte1 ;edx = 0000009bh  movzx ex, byte1     ;cx = 009bh
movsx 指令(進行符號擴充套件並傳送)將源運算元內容複製到目的運算元,並把目的運算元符號擴充套件到 16 位或 32 位。這條指令只用於有符號整數,有三種不同的形式:

movsx reg32, reg/mem8

movsx reg32, reg/mem16

movsx reg16, reg/mem8

運算元進行符號擴充套件時,在目的運算元的全部擴充套件位上重複(複製)長度較小運算元的最高位。下面的例子是將二進位制數 1000 1111b 進行符號擴充套件併發送到 ax:

.data  byteval byte 10001111b  .code  movsx ax,byteval      ;ax = 1111111110001111b
如下圖所示,複製最低 8 位,同時,將源運算元的最高位複製到目的運算元高 8 位的每一位上。

如果乙個十六進製制常數的最大有效數字大於 7,那麼它的最高位等於 1。如下例所示,傳送到 bx 的十六進製制數值為 a69b,因此,數字「a」就意味著最高位是 1。(a69b 前面的 0 是一種方便的表示法,用於防止彙編器將常數誤認為識別符號。)

4.1運算元型別

4.2 mov指令

4.3movzx和movsx指令

4.4 lahf和sahf指令

4.5 xchg指令

4.6直接偏移量運算元

4.7 組合語言資料傳送示例

4.8 加法和減法詳解

4.9offset運算子

4.10 align偽指令

4.11 ptr運算子

4.12 type運算子

4.13lengthof運算子

4.14 label偽指令

4.15 間接定址

4.16 jmp和loop指令

4.1764位mov指令

4.18 64位加法和減法

彙編指令MOVSX與MOVZX

movsx 運算元a 運算元b movzx 運算元a 運算元b 相同點 運算元b 空間必須小於 運算元a 1 格式與mov基本相同 2 能完成小儲存單元向大儲存單元的資料傳送 比如 movsx eax,bx movzx ebx,ax movsx eax,bx movsx,movzx 與mov指令區別...

組合語言 AT T組合語言

這兩天的pwn題環境都是在linux中,採用的組合語言是 at t 格式。之前學習的是intel格式的8086彙編,今天學習了下at t組合語言。基於x86 架構的處理器所使用的彙編指令一般有兩種格式 操作intel格式at t格式 暫存器命名 push eax pushl eax 常數 立即運算元...

組合語言 彙編指令

功能 用來進行資料傳輸。以 mov a,b 為例,相當於a b。具有以下形式 mov 暫存器,資料 mov 暫存器,暫存器 mov 暫存器,記憶體單元 mov 記憶體單元,暫存器 mov 段暫存器,暫存器 功能 用來做加法。以 add a,b 為例,相當於a a b。具有的形式,和 mov 一樣。功...