PUSHA, PUSHAD

Empujar todo registros de proposito general

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
60PUSHAZONo validoValidoEmpuja AX, CX, DX, BX, SP original, BP, SI, y DI.
60PUSHADZONo validoValidoPush EAX, ECX, EDX, EBX, original ESP, EBP, ESI y EDI.

Coste medido

Sin medir: no se ejecuta en procesadores de 64 bits.

Descripción

Empuja el contenido de los registros de proposito general sobre la pila. Los registros se almacenan en la pila en el siguiente orden: EAX, ECX, EDX, EBX, ESP (valor original), EBP, ESI y EDI (si el atributo de operado actual es 32) y AX, CX, DX, BX, SP (valor original), BP, SI Estas instrucciones realizan el funcionamiento inverso de las instrucciones POPA/POPAD. El valor presionado para el registro ESP o SP es su valor antes de presionar el primer registro (ver la sección "Operación" a continuación).

El PUSHA (push all) y PUSHAD (push all double) mnemonics referir el mismo código de operación. La instrucción PUSHA está destinada para su uso cuando el operando-size atributo es 16 y la instrucción PUSHAD para cuando el atributo operadsize es 32. Algunos montadores pueden forzar el tamaño de operando a 16 cuando se utiliza PUSHA y a 32 cuando se utiliza PUSHAD. Otros pueden tratar estos mnemonics como sinónimos (PUSHA/PUSHAD) y utilizar el ajuste actual del atributo el operando-size para determinar el tamaño de los valores a ser empujados de la pila, independientemente de la mnemónica utilizada.

En el modo de direccion real, si el registro ESP o SP es 1, 3, o 5 cuando PUSHA/PUSHAD ejecuta: se genera una excepción #SS pero no se entrega (el error de pila reportado evita la entrega de #SS). A continuación, el procesador genera un

#DF exception and enters a shutdown state as described in the #DF discussion in Chapter 7 of the Intel(R) 64 and

IA-32 Architectures Software Developer's Manual, Volumen 3A.

Esta instrucción se ejecuta como se describe en modo de compatibilidad y modo legado. No es válido en modo de 64 bits.

Operación

IF 64-bit Mode
    THEN #UD

FI;
IF OperandSize = 32 (* PUSHAD instruction *)

    THEN
          Temp := (ESP);
          Push(EAX);
          Push(ECX);
          Push(EDX);
          Push(EBX);
          Push(Temp);
          Push(EBP);
          Push(ESI);
          Push(EDI);

    ELSE (* OperandSize = 16, PUSHA instruction *)
          Temp := (SP);
          Push(AX);
          Push(CX);
          Push(DX);
          Push(BX);
          Push(Temp);


          Push(BP);
          Push(SI);
          Push(DI);
FI;

Banderas afectadas

None.

Excepciones

Modo protegido
#SS(0)Si la dirección de pila de inicio o terminación está fuera del límite de 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.
#UDSi se utiliza el prefijo LOCK.
Modo real
#GPSi el registro ESP o SP contiene 7, 9, 11, 13, o 15.
#UDSi se utiliza el prefijo LOCK.
Modo virtual-8086
#GP(0)Si el registro ESP o SP contiene 7, 9, 11, 13, o 15. #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.
#UDSi se utiliza el prefijo LOCK.
Modo de compatibilidad
Las mismas excepciones que en modo protegido.
Modo de 64 bits
#UDSi en modo 64-bit.

Fuentes