SCAS, SCASB, SCASW, SCASD
扫描字符串
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
AE | SCAS m8 | ZO | 有效 | 有效 | 在 ES (E)DI 或 RDI 时比较 AL 和字节,然后设置 状态标志 1 。 |
AF | SCAS m16 | ZO | 有效 | 有效 | 将 AX 与 ES (E)DI 或 RDI 的单词比较,然后设置 状态标志. |
AF | SCAS m32 | ZO | 有效 | 有效 | 在 ES(E)DI 或 RDI 上用双词比较 EAX,然后设置 状态标志.1 |
REX.W + AF | SCAS m64 | ZO | 有效 | 不可编码 | 将RAX与RDI或EDI的四字比较,然后设置状态标志. |
AE | SCASB | ZO | 有效 | 有效 | 在 ES (E)DI 或 RDI 时将 AL 与字节比较,然后设置 状态标志. |
AF | SCASW | ZO | 有效 | 有效 | 将 AX 与 ES (E)DI 或 RDI 的单词比较,然后设置 状态标志. |
AF | SCASD | ZO | 有效 | 有效 | 在ES: (E)DI或RDI时用双词比较EAX,然后设置状态标志.1. |
REX.W + AF | SCASQ | ZO | 有效 | 不可编码 | 将RAX与RDI或EDI的四字比较,然后设置状态标志. |
实测开销
正在从 arch-data 加载实测数据...
涉及的标志位
CF进位PF奇偶AF辅助进位ZF零SF符号OF溢出
说明
在非64位模式和默认的64位模式中: 本指令将使用 内存操作数 指定的字节,单词,双词或四词与 AL,AX 或 EAX 中的值进行比较. 随后它将状态标志设置在EFLAGS记录结果. 内存操作数地址从ES:(E)DI寄存器读取(取决于指令的地址大小属性和当前运行模式). 请注意, ES 无法被段覆盖前缀所覆盖 。
在编组码级别上,允许有两种形式的本指令. 显式-操作数形式和无显式-操作数形式. 显式-操作数形式(使用SCAS mnemonic指定)允许一个内存操作数明确指定. 内存操作数必须是表示操作数值大小和位置的符号. 然后自动选择寄存器操作数,以匹配内存操作数的大小(AL寄存器用于字节比较,AX用于字节比较,EAX用于双词比较). 提供了明确的操作数表格,以允许文件。 请注意,该表格提供的文件可能具有误导性。 也就是说,内存操作数符号必须指定操作数的正确类型(大小)(字节,单词,或双词),但不必指定正确的位置. 位置总是由ES:(E)DI指定.
指令的无操作数形式使用SCAS的简称. 同样,ES:(E)DI被假定为内存操作数和AL,AX,或EAX被假定为寄存器操作数. 操作数的大小由元音选择: SCASB(字形比较),SCASW(字形比较),或SCASD(双字比较).
比较后,(E)DI寄存器根据EFLAGS寄存器中DF旗的设置自动递增或递减. 如果DF旗为0,则(E)DI登记册递增;如果DF旗为1,则(E)DI登记册递减. 收录器增减1个字节操作,2个字节操作,4个字节操作.
SCAS, SCASB, SCASW, SCASD,以及SCASQ可在REP块比较的前缀ECX字节,词,双字,或四字. 然而,这些指令往往会被用在LOOP构造中,在状态标志的设置基础上进行一些动作. 见"REP/REPE/REPZ/REPNE/REPNZ--重复弦动".
前缀"在本章中用于描述REP前缀.
在64位模式下,指令的默认地址大小为64位,32位地址大小使用前缀支持
67H (英语). 使用REX前缀,形式为REX.W,在双词操作数上促进操作到64位. 64位 nooperand mnemonic为SCASQ. 中国植物物种信息数据库. 内存操作数的地址在RDI或EDI中指定,而AL/AX/EAX/RAX可以作为寄存器操作数. 比较后,目的地登记册递增
或被当前操作数大小(取决于DF旗的值)降低. 参见本节开头的汇总图,用于编码数据和限制.
行动
Non-64-bit Mode:
IF (Byte comparison)
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);
IF DF = 0
THEN (E)DI := (E)DI + 2;
ELSE (E)DI := (E)DI 2; FI;
FI;
ELSE IF (Doubleword comparison)
THEN
temp := EAX SRC;
SetStatusFlags(temp);
IF DF = 0
THEN (E)DI := (E)DI + 4;
ELSE (E)DI := (E)DI 4; FI;
FI;
FI;
64-bit Mode:
IF (Byte comparison)
THEN
temp := AL - SRC;
SetStatusFlags(temp);
THEN IF DF = 0
THEN (R|E)DI := (R|E)DI + 1;
ELSE (R|E)DI := (R|E)DI 1; FI;
ELSE IF (Word comparison)
THEN
temp := AX - SRC;
SetStatusFlags(temp);
IF DF = 0
THEN (R|E)DI := (R|E)DI + 2;
ELSE (R|E)DI := (R|E)DI 2; FI;
FI;
ELSE IF (Doubleword comparison)
THEN
temp := EAX SRC;
SetStatusFlags(temp);
IF DF = 0
THEN (R|E)DI := (R|E)DI + 4;
ELSE (R|E)DI := (R|E)DI 4; FI;
FI;
ELSE IF (Quadword comparison using REX.W )
THEN
temp := RAX - SRC;
SetStatusFlags(temp);
IF DF = 0
THEN (R|E)DI := (R|E)DI + 8;
ELSE (R|E)DI := (R|E)DI 8;
FI;
FI;
FI;受影响的旗帜
OF,SF,ZF,AF,PF,和CF旗根据比较的临时结果设置.
异常
保护模式
#GP(0) | 如果 内存操作数 有效地址在 ES 段的界限之外。如果 ES 寄存器中包含 NULL 段选择子 。如果给出了 ES 段内非法的 内存操作数 有效地址。 #PF(fault-code) 如果发生 页面错误 。 |
#AC(0) | 如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用. |
#UD | 如果使用 LOCK 前缀 。 |
实地址模式
#GP | 如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外. |
#SS | 如果 内存操作数 的有效地址在 SS 段限制之外。 |
#UD | 如果使用 LOCK 前缀 。 |
虚拟 8086 模式
#GP(0) | 如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外. |
#SS(0) | 如果 内存操作数 有效地址在 SS 段限制之外. #PF(fault-code) 如果 页面错误 发生. |
#AC(0) | 如果启用对齐检查, 并使用不对齐的内存引用 。 |
#UD | 如果使用 LOCK 前缀 。 |
兼容模式
| 与保护模式中的例外相同. |
64 位模式
#GP(0) | 如果内存地址是非冠状的. #PF(fault-code) 如果发生 页面错误. |
#AC(0) | 如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用. |
#UD | 如果使用 LOCK 前缀 。 |