VERR, VERW

Verifique un Segmento para la lectura o escritura

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
0F 00 /4VERR r/m16MValidoValidoEstablecer ZF=1 si el segmento especificado con r/m16 se puede leer.
0F 00 /5VERW r/m16MValidoValidoEstablecer ZF=1 si el segmento especificado con r/m16 puede ser escrito.

Codificacion de operandos

Cada modo es un valor de la columna Op/En de arriba. Dice en que campo de la instruccion codificada va cada operando, en el orden en que se escriben, y si la instruccion lo lee, lo escribe o ambas cosas.

M

  1. modrm.rm lecturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide

Coste medido

Cargando las mediciones de arch-data...

Banderas nombradas

Descripción

Verifica si el código o segmento de datos especificado con el operando de origen es legible (VERR) o writable (VERW) del nivel de privilegio actual (CPL). El operando de origen es un registro de 16 bits o una ubicación de memoria que contiene el selector de segmento para verificar el segmento. Si el segmento es accesible y legible (VERR) o writable (VERW), se establece la bandera ZF; de lo contrario, la bandera ZF se pone a cero. Los segmentos de código nunca son verificables. Este cheque no se puede realizar en segmentos del sistema.

Para establecer la bandera ZF, se deben cumplir las siguientes condiciones:

menos o el mismo privilegio que) tanto el CPL como el el selector de segmento de RPL.

La validación realizada es la misma que se realiza cuando un selector de segmento se carga en el registro DS, ES, FS o GS, y el acceso indicado (leer o escribir) se realiza. El valor del selector de segmento no puede resultar en una excepción de protección, lo que permite al software anticipar posibles problemas de acceso a segmentos.

La operación de esta instrucción es la misma en modos no-64-bit y modo 64-bit. El tamaño de operando se fija en 16 bits.

Operación

IF SRC(Offset) > (GDTR(Limit) or (LDTR(Limit))
    THEN ZF := 0; FI;

Read segment descriptor;

IF SegmentDescriptor(DescriptorType) = 0 (* System segment *)
or (SegmentDescriptor(Type)  conforming code segment)

and (CPL > DPL) or (RPL > DPL)
    THEN
          ZF := 0;
    ELSE

        IF ((Instruction = VERR) and (Segment readable))
        or ((Instruction = VERW) and (Segment writable))

                THEN
                      ZF := 1;

                ELSE
                      ZF := 0;


          FI;
FI;

Banderas afectadas

La bandera ZF se establece a 1 si el segmento es accesible y legible (VERR) o writable (VERW); de lo contrario, se establece a 0.

Excepciones

Modo protegido
Las únicas excepciones generadas para estas instrucciones son las relacionadas con el abordaje ilegal del operando de origen.
#GP(0)Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS. Si el registro DS, ES, FS o GS se utiliza para acceder a la memoria y contiene un NULL selector de segmento.
#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 mientras que el nivel de privilegio actual es 3.
#UDSi se utiliza el prefijo LOCK.
Modo real
#UDLas instrucciones VERR y VERW no se reconocen en modo de direccion real. Si se utiliza el prefijo LOCK.
Modo virtual-8086
#UDLas instrucciones VERR y VERW no se reconocen en modo virtual-8086. Si se utiliza el prefijo LOCK.
Modo de compatibilidad
Las mismas excepciones que en modo protegido.
Modo de 64 bits
#SS(0)Si una dirección de memoria que hace referencia al segmento SS está en forma no canónica.
#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