STOS/STOSB/STOSW/STOSD - 儲存字串

操作碼

指令

說明

AA

STOS m8

將 AL 儲存到地址 ES:(E)DI

AB

STOS m16

將 AX 儲存到地址 ES:(E)DI

AB

STOS m32

將 EAX 儲存到地址 ES:(E)DI

AA

STOSB

將 AL 儲存到地址 ES:(E)DI

AB

STOSW

將 AX 儲存到地址 ES:(E)DI

AB

STOSD

將 EAX 儲存到地址 ES:(E)DI

說明

將 AL、AX 或 EAX 暫存器中的位元組、字或雙字分別儲存到目標運算元。目標運算元是記憶體位置,其地址從 ES:EDI 或 ES:DI 暫存器讀取(具體取決於指令的地址大小屬性,分別是 32 或 16)。ES 段不能使用跨段字首覆蓋。

在彙編程式碼級別,此指令允許採用兩種形式:“顯式運算元”形式與“無運算元”形式。顯式運算元形式(使用 STOS 助記符指定)可以明確指定目標運算元。這裡,目標運算元應該是表示目標值大小與位置的符號。接著,自動選擇與目標運算元大小匹配的源運算元(對於位元組運算元,選擇 AL 暫存器;對於字運算元,選擇 AX;對於雙字運算元,選擇 EAX)。提供此顯式運算元形式是爲了便於記錄;不過請注意,此形式提供的記錄可能會令人誤解。也就是說,目標運算元符號必須指定運算元(位元組、字或雙字)的正確型別(大小),但不必指定正確的位置。位置總是由 ES:(E)DI 暫存器指定,在執行儲存字串指令之前,必須先正確載入這些暫存器。

無運算元形式提供“簡短形式”的位元組、字及雙字版 STOS 指令。這裡,同樣假設 ES:(E)DI 是目標運算元,假設 AL、AX 或 EAX 暫存器是源運算元。目標運算元與源運算元的大小使用助記符選擇:STOSB(從暫存器 AL 讀取的位元組)、STOSW(從 AX 讀取的字)或 STOSD(從 EAX 讀取的雙字)。

從 AL、AX 或 EAX 暫存器將位元組、字或雙字傳輸到記憶體位置之後,根據 EFLAGS 暫存器中的 DF 標誌的設定,(E)DI 暫存器會自動遞增或遞減。(如果 DF 標誌是 0,則 (E)DI 暫存器遞增;如果 DF 標誌是 1,則 (E)DI 暫存器遞減)。對於位元組操作,(E)DI 暫存器遞增或遞減 1;對於字操作,遞增或遞減 2;對於雙字操作,遞增或遞減 4。

通過 REP 字首,可以使用 STOS、STOSB、STOSW 及 STOSD 指令整塊載入 ECX 位元組、字或雙字。不過,這些指令更經常用在 LOOP 結構中,因為數據需要先移到 AL、AX 或 EAX,然後才可以儲存。如需有關 REP 字首的說明,請參閱本章的 REP/REPE/REPZ/REPNE/REPNZ - 重複字串操作字首

操作

IF (byte store)
THEN
DEST AL;
THEN IF DF 0
THEN (E)DI (E)DI + 1;
ELSE (E)DI (E)DI - 1;
FI;
ELSE IF (word store)
THEN
DEST AX;
THEN IF DF 0
THEN (E)DI (E)DI + 2;
ELSE (E)DI (E)DI - 2;
FI;
ELSE (* doubleword store *)
DEST EAX;
THEN IF DF 0
THEN (E)DI (E)DI + 4;
ELSE (E)DI (E)DI - 4;
FI;
FI;
FI;

影響的標誌

無。

保護模式異常

#GP(0) - 如果目標位於不可寫的段。如果記憶體運算元的有效地址超出 ES 段的限制。如果 ES 暫存器包含空的段選擇器。

#PF(錯誤程式碼) - 如果發生頁錯誤。

#AC(0) - 如果在目前特權級別為 3 且啟用對齊檢查的情況下進行未對齊的記憶體引用。

實地址模式異常

#GP - 如果記憶體運算元的有效地址超出 ES 段的限制。

虛 8086 模式異常

#GP(0) - 如果記憶體運算元的有效地址超出 ES 段的限制。

#PF(錯誤程式碼) - 如果發生頁錯誤。

#AC(0) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。