LODS/LODSB/LODSW/LODSD - 載入字串

操作碼

指令

說明

AC

LODS m8

將位於地址 DS:(E)SI 的位元組載入到 AL

AD

LODS m16

將位於地址 DS:(E)SI 的字載入到 AX

AD

LODS m32

將位於地址 DS:(E)SI 的雙字載入到 EAX

AC

LODSB

將位於地址 DS:(E)SI 的位元組載入到 AL

AD

LODSW

將位於地址 DS:(E)SI 的字載入到 AX

AD

LODSD

將位於地址 DS:(E)SI 的雙字載入到 EAX

說明

將源運算元中的位元組、字或雙字分別載入到 AL、AX 或 EAX 暫存器。源運算元是記憶體位置,其地址從 DS:EDI 或 DS:SI 暫存器中讀取(具體取決於指令的地址大小屬性,分別為 32 或 16)。DS 段可以使用跨段字首覆蓋。

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

無運算元形式提供“簡短形式”的位元組、字及雙字版 LODS 指令。這裡,同樣假設 DS:(E)SI 是源運算元,假設 AL、AX 或 EAX 暫存器是目標運算元。源運算元與目標運算元的大小使用助記符選擇:LODSB(位元組載入到暫存器 AL)、LODSW(字載入到 AX)或 LODSD(雙字載入到 EAX)。

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

通過 REP 字首,可以使用 LODS、LODSB、LODSW 及 LODSD 指令整塊載入 ECX 位元組、字或雙字。不過,更常見的情況是在 LOOP 結構中使用這些指令,因為在進行下一次傳輸之前,通常有必要進一步處理移到暫存器的數據。如需有關 REP 字首的說明,請參閱本章的 REP/REPE/REPZ/REPNE/REPNZ - 重複字串操作字首

操作

IF (byte load)
THEN
AL SRC; (* byte load *)
THEN IF DF 0
THEN (E)SI (E)SI + 1;
ELSE (E)SI (E)SI - 1;
FI;
ELSE IF (word load)
THEN
AX SRC; (* word load *)
THEN IF DF 0
THEN (E)SI (E)SI + 2;
ELSE (E)SI (E)SI - 2;
FI;
ELSE (* doubleword transfer *)
EAX SRC; (* doubleword load *)
THEN IF DF 0
THEN (E)SI (E)SI + 4;
ELSE (E)SI (E)SI - 4;
FI;
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 段限制。

虛 8086 模式異常

#GP(0) - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。

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

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

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