LAR

Derechos de acceso de carga

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
0F 02 /rLAR r16, r16/m16RMValidoValidoDerechos de acceso de carga del descriptor especificado.
0F 02 /rLAR r32, r32/m161RMValidoValidoDerechos de acceso de carga del descriptor especificado.
REX.W + 0F 02/rLAR r32, r64/m161RMValidoNo codificableDerechos de acceso de carga del descriptor especificado.

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.

RM

  1. modrm.reg escriturabyte ModRM, campo reg (bits 5-3)
  2. 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

Carga los derechos de acceso del descriptor de segmento especificado por el segundo operando (operando de origen) en el primer operando (operando de destino) y establece la bandera ZF en el registro EFLAGS. El operando de origen (que puede ser un registro o una ubicación de memoria) contiene el selector de segmento para el descriptor de segmento que se accede. Si el operando de origen es una dirección de memoria, sólo se accede a 16 bits de datos. El operando de destino es un registro para fines generales.

El procesador realiza cheques de acceso como parte del proceso de carga. Una vez cargado en el registro de destino, el software puede realizar cheques adicionales sobre la información de derechos de acceso.

Los derechos de acceso para un descriptor de segmento incluyen campos ubicados en la segunda palabra doble (bytes 47) del descriptor de segmento. Los siguientes campos están cargados por la instrucción LAR:

-- Bits 19:16 are undefined.

-- Bit 20 devuelve el bit disponible en el descriptor.

-- Bits 31:24 are returned as 0.

Cuando el tamaño de operando es de 16 bits, sólo se devuelven los 16 bits bajos identificados anteriormente; los bits superiores del destino son sin modificar. Cuando el tamaño de operando es de 32 bits, el valor de 32 bits identificado anteriormente se carga en el operando de destino; las partes superiores del destino se limpian. Cuando el operando es de 64 bits, el valor de 32 bits es ceroextended a 64 bits y se carga en el operando de destino. (El comportamiento con tamaños operando de 32 bits y 64 bits es idéntico).

Esta instrucción realiza los siguientes cheques antes de cargar los derechos de acceso en el registro de destino:

accessed

(se puede acceder con) la instrucción LAR. El segmento del sistema válido y los tipos de descriptores de puerta se dan en

*Si el segmento no es un segmento de código de conformidad, comprueba que el descriptor de segmento especificado es visible en
el CPL (es decir, si el CPL y el RPL del selector de segmento son menos o igual al DPL del segmento
selector).

Tipos de segmento y puerta

*Si el segmento no es un segmento de código de conformidad, comprueba que el descriptor de segmento especificado es visible en
el CPL (es decir, si el CPL y el RPL del selector de segmento son menos o igual al DPL del segmento
selector).

Operación

IF Offset(SRC) > descriptor table limit
    THEN
          ZF := 0;
    ELSE
          SegmentDescriptor := descriptor referenced by SRC;

        IF SegmentDescriptor(Type)  conforming code segment

          and (CPL > DPL) or (RPL > DPL)
          or SegmentDescriptor(Type) is not valid for instruction

                THEN
                      ZF := 0;

                ELSE
                      DEST := access rights from SegmentDescriptor as given in Description section;
                      ZF := 1;

          FI;
FI;

Banderas afectadas

La bandera ZF se fija a 1 si los derechos de acceso se cargan con éxito; de lo contrario, se pone a cero a 0.

Excepciones

Modo protegido
#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 la alineación está habilitada y la dirección efectiva del operando de memoria no está alineada mientras que el nivel de privilegio actual es 3.
#UDSi se utiliza el prefijo LOCK.
Modo real
#UDLa instrucción LAR no se reconoce en modo de direccion real.
Modo virtual-8086
#UDLa instrucción LAR no se puede ejecutar en modo virtual-8086.
Modo de compatibilidad
Las mismas excepciones que en modo protegido.
Modo de 64 bits
#SS(0)Si el operando de memoria dirección efectiva referenciar el segmento SS está en forma no canónica.
#GP(0)Si el operando de memoria dirección efectiva está en forma no canónica. #PF(fault-code) Si un fallo de pagina ocurre.
#AC(0)Si la comprobación de la alineación está habilitada y la dirección efectiva del operando de memoria no está alineada mientras que el nivel de privilegio actual es 3.
#UDSi se utiliza el prefijo LOCK.

Fuentes