操作碼 |
指令 |
說明 |
A4 |
MOVS m8, m8 |
將位於地址 DS:(E)SI 的位元組移到地址 ES:(E)DI |
A5 |
MOVS m16, m16 |
將位於地址 DS:(E)SI 的字移到地址 ES:(E)DI |
A5 |
MOVS m32, m32 |
將位於地址 DS:(E)SI 的雙字移到地址 ES:(E)DI |
A4 |
MOVSB |
將位於地址 DS:(E)SI 的位元組移到地址 ES:(E)DI |
A5 |
MOVSW |
將位於地址 DS:(E)SI 的字移到地址 ES:(E)DI |
A5 |
MOVSD |
將位於地址 DS:(E)SI 的雙字移到地址 ES:(E)DI |
將第二個運算元(源運算元)指定的位元組、字或雙字移到第一個運算元(目標運算元)指定的位置。源運算元與目標運算元都是記憶體位置。源運算元的地址從 DS:ESI 或 DS:SI 暫存器中讀取(具體取決於指令的地址大小屬性,分別為 32 或 16)。目標運算元的地址從 ES:EDI 或 ES:DI 暫存器中讀取(具體也取決於指令的地址大小屬性)。DS 段可以用跨段字首覆蓋,但 ES 段不能覆蓋。
在彙編程式碼級別,此指令允許採用兩種形式:“顯式運算元”形式與“無運算元”形式。顯式運算元形式(使用 MOVS 助記符指定)可以明確指定源運算元與目標運算元。這裡,源運算元與目標運算元應該是分別表示源運算元值與目標運算元值的大小與位置的符號。提供此顯式運算元形式是爲了便於記錄;不過請注意,此形式提供的記錄可能會令人誤解。也就是說,源運算元符號與目標運算元符號必須指定運算元(位元組、字或雙字)的正確型別(大小),但不必指定正確的位置。源運算元與目標運算元的位置總是由 DS:(E)SI 與 ES:(E)DI 暫存器指定,而且必須在執行字串移動指令之前正確載入這些暫存器。
無運算元形式提供“簡短形式”的位元組、字及雙字版 MOVS 指令。這裡,同樣假設 DS:(E)SI 與 ES:(E)DI 分別是源運算元與目標運算元。源運算元與目標運算元的大小使用助記符選擇:MOVSB(位元組移動)、MOVSW(字移動)或 MOVSD(雙字移動)。
執行移動操作之後,根據 EFLAGS 暫存器中的 DF 標誌的設定,(E)SI 與 (E)DI 暫存器會自動遞增或遞減。(如果 DF 標誌為 0,則 (E)SI 與 (E)DI 暫存器遞增;如果 DF 標誌為 1,則 (E)SI 與 (E)DI 暫存器遞減)。對於位元組操作,暫存器遞增或遞減 1;對於字操作,遞增或遞減 2;對於雙字操作,則遞增或遞減 4。
通過 REP 字首,MOVS、MOVSB、MOVSW 及 MOVSD 指令可以整塊移動 ECX 位元組、字或雙字(請參閱本章的“REP/REPE/REPZ/REPNE/REPNZ - 重複字串操作字首”)。
DEST SRC;
IF (byte move)
THEN IF DF 0
THEN
(E)SI (E)SI + 1;
(E)DI (E)DI + 1;
ELSE
(E)SI (E)SI - 1;
(E)DI (E)DI - 1;
FI;
ELSE IF (word move)
THEN IF DF 0
(E)SI (E)SI + 2;
(E)DI (E)DI + 2;
ELSE
(E)SI (E)SI - 2;
(E)DI (E)DI - 2;
FI;
ELSE (* doubleword move*)
THEN IF DF 0
(E)SI (E)SI + 4;
(E)DI (E)DI + 4;
ELSE
(E)SI (E)SI - 4;
(E)DI (E)DI - 4;
FI;
FI;
無。
#GP(0) - 如果目標位於不可寫的段。如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。如果 DS、ES、FS 或 GS 暫存器包含空的段選擇器。
#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。
#PF(錯誤程式碼) - 如果發生頁錯誤。
#AC(0) - 如果啟用對齊檢查並在目前特權級別為 3 時進行未對齊的記憶體引用。
#GP - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。
#SS - 如果記憶體運算元有效地址超出 SS 段限制。
#GP(0) - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。
#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。
#PF(錯誤程式碼) - 如果發生頁錯誤。
#AC(0) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。