LTR
Registro de tareas de carga
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
0F 00 /3 | LTR r/m16 | M | Valido | Valido | Carga r/m16 en el registro de tareas. |
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
modrm.rmlecturabyte 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...
Descripción
Carga el operando de origen en el campo el selector de segmento del registro de tareas. El operando de origen (un registro general o una ubicación de memoria) contiene un selector de segmento que apunta a un segmento del estado de tarea (TSS). Después de que el selector de segmento esté cargado en el registro de tareas, el procesador utiliza el selector de segmento para localizar el descriptor de segmento para el TSS en la tabla descriptor global (GDT). Luego carga el límite de segmento y la dirección base para el TSS del descriptor de segmento en el registro de tareas. La tarea señalada por el registro de tareas está marcadamente ocupada, pero no se produce un cambio a la tarea.
La instrucción LTR se proporciona para uso en el software del sistema operativo; no debe ser utilizado en los programas de aplicación. Sólo se puede ejecutar en modo protegido cuando el CPL es 0. Es comúnmente utilizado en el código de inicialización para establecer la primera tarea a ejecutar.
El atributo el operando-size no tiene efecto en esta instrucción.
En modo de 64 bits, el tamaño de operando todavía se fija en 16 bits. La instrucción hace referencia a un descriptor de 16 bytes para cargar la base de 64 bits.
Operación
IF SRC is a NULL selector
THEN #GP(0);
IF SRC(Offset) > descriptor table limit OR IF SRC(type) global
THEN #GP(segment selector); FI;
Read segment descriptor;
IF segment descriptor is not for an available TSS
THEN #GP(segment selector); FI;
IF segment descriptor is not present
THEN #NP(segment selector); FI;
TSSsegmentDescriptor(busy) := 1;
(* Locked read-modify-write operation on the entire descriptor when setting busy flag *)
TaskRegister(SegmentSelector) := SRC;
TaskRegister(SegmentDescriptor) := TSSSegmentDescriptor;Banderas afectadas
None.
Excepciones
Modo protegido
#GP(0) | Si el nivel actual de privilegios no es 0. Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS. Si el operando de origen contiene un NULL selector de segmento. Si el registro DS, ES, FS o GS se utiliza para acceder a la memoria y contiene un NULL selector de segmento. |
#GP(selector) | Si el selector de origen apunta a un segmento que no es un TSS o a uno para una tarea que ya está ocupado. Si el selector apunta a LDT o está más allá del límite GDT. |
#NP(selector) | Si el descriptor TSS está marcado no está presente. |
#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. |
#UD | Si se utiliza el prefijo LOCK. |
Modo real
#UD | La instrucción LTR no se reconoce en modo de direccion real. |
Modo virtual-8086
#UD | La instrucción LTR no se reconoce en modo virtual-8086. |
Modo de compatibilidad
| Las mismas excepciones que en modo protegido, así como las siguientes: | |
#GP(selector) | Si el selector de fuente apunta a un TSS de 16 bits. |
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 el nivel actual de privilegios no es 0. Si la dirección de memoria está en forma no canónica. Si el operando de origen contiene un NULL selector de segmento. |
#GP(selector) | Si el selector de origen apunta a un segmento que no es un TSS, a un TSS de 16 bits, o a un TSS para una tarea que ya está ocupada. Si el selector apunta a LDT o está más allá del límite GDT. Si el tipo de descriptor de la parte superior de 8 bytes del descriptor de 16 bytes es non-zero. |
#NP(selector) | Si el descriptor TSS está marcado no está presente. #PF(fault-code) Si un fallo de pagina ocurre. |
#UD | Si se utiliza el prefijo LOCK. |