操作碼 |
指令 |
說明 |
AE |
SCAS m8 |
比較 AL 與 ES:(E)DI 處的位元組,並設定狀態標誌 |
AF |
SCAS m16 |
比較 AX 與 ES:(E)DI 處的字,並設定狀態標誌 |
AF |
SCAS m32 |
比較 EAX 與 ES:(E)DI 處的雙字,並設定狀態標誌 |
AE |
SCASB |
比較 AL 與 ES:(E)DI 處的位元組,並設定狀態標誌 |
AF |
SCASW |
比較 AX 與 ES:(E)DI 處的字,並設定狀態標誌 |
AF |
SCASD |
比較 EAX 與 ES:(E)DI 處的雙字,並設定狀態標誌 |
將記憶體運算元指定的位元組、字或雙字與 AL、AX 或 EAX 暫存器中的值,並根據結果設定 EFLAGS 暫存器中的狀態標誌。記憶體運算元地址從 DS:EDI 或 DS:DI 暫存器中讀取(具體取決於指令的地址大小屬性,分別為 32 或 16)。ES 段不能使用跨段字首覆蓋。
在彙編程式碼級別,此指令允許採用兩種形式:“顯式運算元”形式與“無運算元”形式。顯式運算元形式(使用 SCAS 助記符指定)可以明確指定記憶體運算元。這裡,記憶體運算元應該是表示運算元值大小與位置的符號。接著,自動選擇與源運算元大小匹配的暫存器運算元(對於位元組比較,選擇 AL 暫存器;對於字比較,選擇 AX;對於雙字比較,選擇 EAX)。提供此顯式運算元形式是爲了便於記錄;不過請注意,此形式提供的記錄可能會令人誤解。也就是說,記憶體運算元符號必須指定運算元(位元組、字或雙字)的正確型別(大小),但不必指定正確的位置。位置總是由 ES:(E)DI 暫存器指定,在執行比較字串指令之前,必須先正確載入這些暫存器。
無運算元形式提供“簡短形式”的位元組、字及雙字版 SCAS 指令。這裡,同樣假設 ES:(E)DI 是記憶體運算元,假設 AL、AX 或 EAX 暫存器是暫存器作數。兩個運算元的大小使用助記符選擇:SCASB(位元組比較)、SCASW(字比較)或 SCASD(雙字比較)。
比較之後,根據 EFLAGS 暫存器中 DF 標誌的設定,(E)DI 暫存器會自動遞增或遞減。(如果 DF 標誌是 0,則 (E)DI 暫存器遞增;如果 DF 標誌是 1,則 (E)DI 暫存器遞減)。對於位元組操作,(E)DI 暫存器遞增或遞減 1;對於字操作,遞增或遞減 2;對於雙字操作,遞增或遞減 4。
通過 REP 字首,SCAS、SCASB、SCASW 及 SCASD 指令可用於整塊比較 ECX 位元組、字或雙字。不過,更常見的情況是在 LOOP 結構中使用這些指令,此結構會在進行下一個比較之前,根據狀態標誌的設定執行一些操作。如需有關 REP 字首的說明,請參閱本章的 REP/REPE/REPZ/REPNE/REPNZ - 重複字串操作字首。
IF (byte cmparison)
THEN
temp AL - SRC;
SetStatusFlags(temp);
THEN IF DF 0
THEN (E)DI (E)DI + 1;
ELSE (E)DI (E)DI - 1;
FI;
ELSE IF (word comparison)
THEN
temp AX - SRC;
SetStatusFlags(temp)
THEN IF DF 0
THEN (E)DI (E)DI + 2;
ELSE (E)DI (E)DI - 2;
FI;
ELSE (* doubleword comparison *)
temp EAX - SRC;
SetStatusFlags(temp)
THEN IF DF 0
THEN (E)DI (E)DI + 4;
ELSE (E)DI (E)DI - 4;
FI;
FI;
FI;
OF、SF、ZF、AF PF 及 CF 標誌根據比較的臨時結果設定。
#GP(0) - 如果記憶體運算元有效地址超出 ES 段限制。如果 ES 暫存器包含空的段選擇器。如果 ES 段中給出的記憶體運算元有效地址非法。
#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) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。