CMPS/CMPSB/CMPSW/CMPSD - 比較字串運算元

操作碼

指令

說明

A6

CMPS m8, m8

比較位於地址 DS:(E)SI 的位元組與位於地址 ES:(E)DI 的位元組,並相應設定狀態標誌

A7

CMPS m16, m16

比較位於地址 DS:(E)SI 的字與位於地址 ES:(E)DI 的字,並相應設定狀態標誌

A7

CMPS m32, m32

比較位於地址 DS:(E)SI 的雙字與位於地址 ES:(E)DI 的雙字,並相應設定狀態標誌

A6

CMPSB

比較位於地址 DS:(E)SI 的位元組與位於地址 ES:(E)DI 的位元組,並相應設定狀態標誌

A7

CMPSW

比較位於地址 DS:(E)SI 的字與位於地址 ES:(E)DI 的字,並相應設定狀態標誌

A7

CMPSD

比較位於地址 DS:(E)SI 的雙字與位於地址 ES:(E)DI 的雙字,並相應設定狀態標誌

說明

比較第一個源運算元指定的位元組、字或雙字與第二個源運算元指定的位元組、字或雙字,並根據結果設定 EFLAGS 暫存器中的狀態標誌。兩個源運算元都位於記憶體。第一個源運算元的地址從 DS:ESI 或 DS:SI 暫存器中讀取(具體取決於指令的地址大小屬性,分別為 32 或 16)。第二個源運算元的地址從 ES:EDI 或 ES:DI 暫存器中讀取(具體也取決於指令的地址大小屬性)。DS 段可以用跨段字首覆蓋,但 ES 段不能覆蓋。

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

無運算元形式提供“簡短形式”的位元組、字及雙字版 CMPS 指令。這裡,處理器還假定 DS:(E)SI 與 ES:(E)DI 暫存器指定源運算元的位置。源運算元的大小使用助記符來選擇:CMPSB(位元組比較)、CMPSW(字比較)或 CMPSD(雙字比較)。

比較之後,根據 EFLAGS 暫存器中 DF 標誌的設定,(E)SI 與 (E)DI 暫存器會自動遞增或遞減。(如果 DF 標誌為 0,則 (E)SI 與 (E)DI 暫存器遞增;如果 DF 標誌為 1,則 (E)SI 與 (E)DI 暫存器遞減)。對於位元組操作,暫存器遞增或遞減 1;對於字操作,遞增或遞減 2;對於雙字操作,則遞增或遞減 4。

通過以 REP 字首打頭,CMPS、CMPSB、CMPSW 及 CMPSD 指令可用於成塊比較 ECX 位元組、字或雙字。不過,更常見的情況是在 LOOP 結構中使用這些指令,此結構會在進行下一個比較之前,根據狀態標誌的設定執行一些操作。如需有關 REP 字首的說明,請參閱本章的 REP/REPE/REPZ/REPNE/REPNZ - 重複字串操作字首

操作

temp SRC1 - SRC2;
SetStatusFlags(temp);
IF (byte comparison)
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 comparison)
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 comparison*)
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;

影響的標誌

CF、OF、SF、ZF、AF 及 PF 標誌根據比較的臨時結果設定。

保護模式異常

#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) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。