LOOP, LOOPcc
Loop Según ECX Counter
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
E2 cb | LOOP rel8 | D | Valido | Valido | Cuenta de decremento; salto corto si cuenta 0. |
E1 cb | LOOPE rel8 | D | Valido | Valido | Cuento de decremento; salto corto si cuenta 0 y ZF = 1. |
E0 cb | LOOPNE rel8 | D | Valido | Valido | Cuenta de decremento; salto corto si cuenta 0 y ZF = 0. |
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.
D
offsetdesplazamiento que sigue al opcode
Coste medido
Cargando las mediciones de arch-data...
Descripción
Realiza una operación de bucle usando el registro RCX, ECX o CX como contador (dependiendo de si el tamaño de la dirección es de 64 bits, 32 bits, o 16 bits). Tenga en cuenta que la instrucción LOOP ignora REX.W; pero el tamaño de la dirección de 64 bits puede ser over-ridden utilizando un prefijo 67H.
Cada vez que se ejecuta la instrucción LOOP, el registro de cuenta es decrementado, y luego se verifica para 0. Si el recuento es 0, el bucle se termina y la ejecución del programa continúa con la instrucción siguiendo la instrucción LOOP. Si el conteo no es cero, un salto cercano se realiza al destino (target) operando, que es presumiblemente la instrucción al comienzo del bucle.
La instrucción de destino se especifica con un offset relativo (un offset firmado en relación con el valor actual del puntero de instruccion en el registro IP/EIP/RIP). Este offset se especifica generalmente como una etiqueta en código de montaje, pero a nivel de código de máquina, se codifica como un valor inmediato firmado de 8 bits, que se añade al puntero de instruccion. Se admiten desactivaciones de 128 a +127 con esta instrucción.
Algunas formas de la instrucción del bucle (LOOPcc) también aceptan la bandera ZF como condición para terminar el bucle antes de que el conteo llegue a cero. Con estas formas de la instrucción, un código de condición (cc) se asocia con cada instrucción para indicar la condición que se está probando. Aquí, la instrucción LOOPcc en sí no afecta el estado de la bandera ZF; la bandera ZF se cambia por otras instrucciones en el bucle.
Operación
IF (AddressSize = 32)
THEN Count is ECX;
ELSE IF (AddressSize = 64)
Count is RCX;
ELSE Count is CX;
FI;
Count := Count 1;
IF Instruction is not LOOP
THEN
IF (Instruction := LOOPE) or (Instruction := LOOPZ)
THEN IF (ZF = 1) and (Count 0)
THEN BranchCond := 1;
ELSE BranchCond := 0;
FI;
ELSE (Instruction = LOOPNE) or (Instruction = LOOPNZ)
IF (ZF = 0 ) and (Count 0)
THEN BranchCond := 1;
ELSE BranchCond := 0;
FI;
FI;
ELSE (* Instruction = LOOP *)
IF (Count 0)
THEN BranchCond := 1;
ELSE BranchCond := 0;
FI;
FI;
IF BranchCond = 1
THEN
IF in 64-bit mode (* OperandSize = 64 *)
THEN
tempRIP := RIP + SignExtend(DEST);
IF tempRIP is not canonical
THEN #GP(0);
ELSE RIP := tempRIP;
FI;
ELSE
tempEIP := EIP SignExtend(DEST);
IF OperandSize 16
THEN tempEIP := tempEIP AND 0000FFFFH;
FI;
IF tempEIP is not within code segment limit
THEN #GP(0);
ELSE EIP := tempEIP;
FI;
FI;
ELSE
Terminate loop and continue program execution at (R/E)IP;
FI;Banderas afectadas
None.
Excepciones
Modo protegido
#GP(0) | Si el offset está más allá de los límites del segmento CS. |
#UD | Si se utiliza el prefijo LOCK. |
Modo real
#GP | Si el offset está más allá de los límites del segmento CS o está fuera del espacio de dirección eficaz de 0 a FFFFH. Esta afección puede ocurrir si se utiliza un prefijo de la dirección de 32 bits. |
#UD | Si se utiliza el prefijo LOCK. |
Modo virtual-8086
| Las mismas excepciones que en modo de dirección real. |
Modo de compatibilidad
| Las mismas excepciones que en modo protegido. |
Modo de 64 bits
#GP(0) | Si el offset se salta en forma no canónica. |
#UD | Si se utiliza el prefijo LOCK. |