SCAS, SCASB, SCASW, SCASD

Scan String

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
AESCAS m8ZOValidoValidoCompare AL con byte en ES:(E)DI o RDI, a continuación, establecer banderas de estado.1
AFSCAS m16ZOValidoValidoCompare AX con la palabra en ES:(E)DI o RDI, a continuación, establecer banderas de estado.1
AFSCAS m32ZOValidoValidoCompare EAX con la palabra doble en ES(E)DI o RDI luego establecer banderas de estado.1
REX.W + AFSCAS m64ZOValidoNo codificableCompare RAX con cuaderno de palabras en RDI o EDI luego establecer banderas de estado.
AESCASBZOValidoValidoCompare AL con byte en ES:(E)DI o RDI luego establecer banderas de estado.1
AFSCASWZOValidoValidoCompare AX con la palabra en ES:(E)DI o RDI luego establecer banderas de estado.1
AFSCASDZOValidoValidoCompare EAX con la palabra doble en ES:(E)DI o RDI luego establecer banderas de estado.1
REX.W + AFSCASQZOValidoNo codificableCompare RAX con cuaderno de palabras en RDI o EDI luego establecer banderas de estado.

Coste medido

Cargando las mediciones de arch-data...

Banderas nombradas

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.
#UDSi se utiliza el prefijo LOCK.
Modo real
#GPSi un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS.
#SSSi un operando de memoria dirección efectiva está fuera del límite del segmento SS.
#UDSi 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.
#UDSi 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.
#UDSi se utiliza el prefijo LOCK.

Fuentes