POPA, POPAD
Pop All registros de proposito general
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
61 | POPA | ZO | No valido | Valido | Pop DI, SI, BP, BX, DX, CX y AX. |
61 | POPAD | ZO | No valido | Valido | Pop EDI, ESI, EBP, EBX, EDX, ECX y EAX. |
Coste medido
Sin medir: no se ejecuta en procesadores de 64 bits.
Descripción
Palabras dobles Pops (POPAD) o palabras (POPA) de la pila en los registros de proposito general. Los registros se cargan en el siguiente orden: EDI, ESI, EBP, EBX, EDX, ECX y EAX (si el operando-size atributo es 32) y DI, SI, BP, BX, DX, CX y AX (si el operando-size es 16). (Estas instrucciones revierten el funcionamiento de las instrucciones PUSHA/PUSHAD.) Se ignora el valor de la pila para el registro ESP o SP. En su lugar, el registro ESP o SP se aumenta después de que cada registro se carga.
El POPA (pop all) y POPAD (pop all double) mnemonics hacen referencia al mismo código de operación. La instrucción POPA es para uso cuando el operando-size atributo es 16 y la instrucción POPAD para cuando el operando-size atributo es 32. Algunos montadores pueden forzar el tamaño de operando a 16 cuando se utiliza POPA y a 32 cuando se utiliza POPAD (utilizando el operando-size override prefix [66H] si es necesario). Otros pueden tratar estos mnemonics como sinónimos (POPA/POPAD) y utilizar el ajuste actual del atributo el operando-size para determinar el tamaño de los valores que se han de extraer de la pila, independientemente de la mnemónica utilizada. (La bandera D en el descriptor del segmento de código actual determina el atributo de tamaño el operando).
Esta instrucción se ejecuta como se describe en modos no-64-bit. No es válido en modo de 64 bits.
Operación
IF 64-Bit Mode
THEN
#UD;
ELSE
IF OperandSize = 32 (* Instruction = POPAD *)
THEN
EDI := Pop();
ESI := Pop();
EBP := Pop();
Increment ESP by 4; (* Skip next 4 bytes of stack *)
EBX := Pop();
EDX := Pop();
ECX := Pop();
EAX := Pop();
ELSE (* OperandSize = 16, instruction = POPA *)
DI := Pop();
SI := Pop();
BP := Pop();
Increment ESP by 2; (* Skip next 2 bytes of stack *)
BX := Pop();
DX := Pop();
CX := Pop();
AX := Pop();
FI;
FI;Banderas afectadas
None.
Excepciones
Modo protegido
#SS(0) | Si la dirección de pila inicial o final no está dentro del segmento de la pila. #PF(fault-code) Si un fallo de pagina ocurre. |
#AC(0) | Si se hace una referencia de memoria no alineada mientras que el nivel actual de privilegios es 3 y la comprobación de alineación está habilitada. |
#UD | Si se utiliza el prefijo LOCK. |
Modo real
#SS | Si la dirección de pila inicial o final no está dentro del segmento de la pila. |
#UD | Si se utiliza el prefijo LOCK. |
Modo virtual-8086
#SS(0) | Si la dirección de pila inicial o final no está dentro del segmento de la pila. #PF(fault-code) Si un fallo de pagina ocurre. |
#AC(0) | Si se hace una referencia de memoria no alineada mientras se activa la comprobación de alineación. |
#UD | Si se utiliza el prefijo LOCK. |
Modo de compatibilidad
| Lo mismo que las excepciones modo protegido. |
Modo de 64 bits
#UD | Si en modo 64-bit. |