SCAS, SCASB, SCASW, SCASD
Scan String
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
AE | SCAS m8 | ZO | Valido | Valido | Compare AL con byte en ES:(E)DI o RDI, a continuación, establecer banderas de estado.1 |
AF | SCAS m16 | ZO | Valido | Valido | Compare AX con la palabra en ES:(E)DI o RDI, a continuación, establecer banderas de estado.1 |
AF | SCAS m32 | ZO | Valido | Valido | Compare EAX con la palabra doble en ES(E)DI o RDI luego establecer banderas de estado.1 |
REX.W + AF | SCAS m64 | ZO | Valido | No codificable | Compare RAX con cuaderno de palabras en RDI o EDI luego establecer banderas de estado. |
AE | SCASB | ZO | Valido | Valido | Compare AL con byte en ES:(E)DI o RDI luego establecer banderas de estado.1 |
AF | SCASW | ZO | Valido | Valido | Compare AX con la palabra en ES:(E)DI o RDI luego establecer banderas de estado.1 |
AF | SCASD | ZO | Valido | Valido | Compare EAX con la palabra doble en ES:(E)DI o RDI luego establecer banderas de estado.1 |
REX.W + AF | SCASQ | ZO | Valido | No codificable | Compare RAX con cuaderno de palabras en RDI o EDI luego establecer banderas de estado. |
Coste medido
Cargando las mediciones de arch-data...
Banderas nombradas
CFAcarreoPFParidadAFAcarreo auxiliarZFCeroSFSignoOFDesbordamiento
Descripción
En modos no-64-bit y en modo 64-bit predeterminado: esta instrucción compara un byte, palabra, palabra, palabra doble o cuadword especificado usando un operando de memoria con el valor en AL, AX, o EAX. Luego establece banderas de estado en EFLAGS registrando los resultados. La dirección el operando de memoria se lee en el registro ES:(E)DI (según el atributo tamaño de la dirección de la instrucción y el modo operativo actual). Tenga en cuenta que ES no puede ser superado con un prefijo de anulación de segmento.
En el nivel de código de montaje, se permiten dos formas de esta instrucción. La forma explícita-operando y la forma no-operandos. La forma explícita-operando (especificada usando el SCAS mnemonic) permite que un operando de memoria se especifique explícitamente. El operando de memoria debe ser un símbolo que indica el tamaño y la ubicación del valor el operando. El registro operando se selecciona automáticamente para igualar el tamaño del operando de memoria (Registro A para comparaciones de byte, AX para comparaciones de palabras, EAX para comparaciones de dobles palabras). El formulario explícito-operando se proporciona para permitir la documentación. Tenga en cuenta que la documentación proporcionada por este formulario puede ser engañosa. Es decir, el símbolo el operando de memoria debe especificar el tipo correcto (tamaño) del operando (byte, palabra o palabra doble) pero no tiene que especificar la ubicación correcta. La ubicación siempre es especificada por ES:(E)DI.
La forma no-operandos de la instrucción utiliza una forma corta de SCAS. De nuevo, ES:(E)DI se supone que es el operando de memoria y AL, AX, o EAX se supone que es el registro operando. El tamaño de operandos es seleccionado por la mnemónica: SCASB (con comparación de byte), SCASW (con comparación de palabras), o SCASD (con comparación de doble palabra).
Después de la comparación, el registro (E)DI se aumenta o decrece automáticamente según el ajuste de la bandera DF en el registro EFLAGS. Si la bandera DF es 0, el registro (E)DI se aumenta; si la bandera DF es 1, el registro (E)DI se decrementa. El registro es aumentado o decrementado por 1 para operaciones de byte, por 2 para operaciones de palabras, y por 4 para operaciones de doble palabra.
SCAS, SCASB, SCASW, SCASD, y SCASQ pueden ser precedidos por el prefijo REP para las comparaciones de bloques de bytes ECX, palabras, palabras dobles, o cuádwords. A menudo, sin embargo, estas instrucciones se utilizarán en un constructo LOOP que toma alguna acción basada en el ajuste de banderas de estado. Ver "REP/REPE/REPZ /REPNE/REPNZ--Repeat String Operation
Prefijo" en este capítulo para una descripción del prefijo REP.
En modo de 64 bits, el tamaño de la dirección predeterminada de la instrucción es de 64 bits, el tamaño de la dirección de 32 bits es compatible con el prefijo
67H. Utilizar un prefijo REX en forma de REX.W promueve la operación en doble palabra operando a 64 bits. La mnemónica de 64 bits es SCASQ. La dirección del operando de memoria se especifica en RDI o EDI, y AL/AX/EAX/RAX se puede utilizar como el registro operando. Después de una comparación, el registro de destino se aumenta
o decrementado por el tamaño de operando actual (dependiendo del valor de la bandera DF). Vea la tabla resumen al comienzo de esta sección para la codificación de datos y límites.
Operación
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;Banderas afectadas
Las banderas OF, SF, ZF, AF, PF y CF se establecen según el resultado temporal de la comparación.
Excepciones
Modo protegido
#GP(0) | Si un operando de memoria dirección efectiva está fuera del límite del segmento ES. Si el registro ES contiene un NULL selector de segmento. Si se da una dirección efectiva operando de memoria ilegal en el segmento ES. #PF(fault-code) Si un fallo de pagina ocurre. |
#AC(0) | Si la comprobación de alineación está habilitada y se hace una referencia de memoria no alineada mientras que el nivel de privilegio actual es 3. |
#UD | Si se utiliza el prefijo LOCK. |
Modo real
#GP | Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS. |
#SS | Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. |
#UD | Si se utiliza el prefijo LOCK. |
Modo virtual-8086
#GP(0) | Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS. |
#SS(0) | Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. #PF(fault-code) Si un fallo de pagina ocurre. |
#AC(0) | Si la comprobación de alineación está habilitada y se hace una referencia de memoria no alineada. |
#UD | Si se utiliza el prefijo LOCK. |
Modo de compatibilidad
| Las mismas excepciones que en modo protegido. |
Modo de 64 bits
#GP(0) | Si la dirección de memoria está en forma no canónica. #PF(fault-code) Si un fallo de pagina ocurre. |
#AC(0) | Si la comprobación de alineación está habilitada y se hace una referencia de memoria no alineada mientras que el nivel de privilegio actual es 3. |
#UD | Si se utiliza el prefijo LOCK. |