Are you sure this is the correct order of execution? The instruction is
documented as first lowering the stack pointer, then writing to the new
location.
If a stack exception occurs, you might have esp off by 4.
Am 21.11.2014 10:46, schrieb aandrejevic(a)svn.reactos.org:
  Author: aandrejevic
 Date: Fri Nov 21 09:46:57 2014
 New Revision: 65441
 URL: 
http://svn.reactos.org/svn/reactos?rev=65441&view=rev
 Log:
 [FAST486]
 Attempt to write the value to the stack before subtracting from the actual ESP register
 in Fast486StackPush.
 Modified:
      trunk/reactos/lib/fast486/common.inl
 Modified: trunk/reactos/lib/fast486/common.inl
 URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/fast486/common.inl?rev…
 ==============================================================================
 --- trunk/reactos/lib/fast486/common.inl       [iso-8859-1] (original)
 +++ trunk/reactos/lib/fast486/common.inl       [iso-8859-1] Fri Nov 21 09:46:57 2014
 @@ -317,15 +317,19 @@
               return FALSE;
           }
 +        /* Store the value in SS:[ESP - 4] */
 +        if (!Fast486WriteMemory(State,
 +                                FAST486_REG_SS,
 +                                State->GeneralRegs[FAST486_REG_ESP].Long -
sizeof(ULONG),
 +                                &Value,
 +                                sizeof(ULONG)))
 +        {
 +            /* Exception occurred */
 +            return FALSE;
 +        }
 +
           /* Subtract ESP by 4 */
           State->GeneralRegs[FAST486_REG_ESP].Long -= sizeof(ULONG);
 -
 -        /* Store the value in SS:ESP */
 -        return Fast486WriteMemory(State,
 -                                  FAST486_REG_SS,
 -                                  State->GeneralRegs[FAST486_REG_ESP].Long,
 -                                  &Value,
 -                                  sizeof(ULONG));
       }
       else
       {
 @@ -339,16 +343,22 @@
               return FALSE;
           }
 +        /* Store the value in SS:[SP - 2] */
 +        if (!Fast486WriteMemory(State,
 +                                FAST486_REG_SS,
 +                                LOWORD(State->GeneralRegs[FAST486_REG_ESP].LowWord -
sizeof(USHORT)),
 +                                &ShortValue,
 +                                sizeof(USHORT)))
 +        {
 +            /* Exception occurred */
 +            return FALSE;
 +        }
 +
           /* Subtract SP by 2 */
           State->GeneralRegs[FAST486_REG_ESP].LowWord -= sizeof(USHORT);
 -
 -        /* Store the value in SS:SP */
 -        return Fast486WriteMemory(State,
 -                                  FAST486_REG_SS,
 -                                  State->GeneralRegs[FAST486_REG_ESP].LowWord,
 -                                  &ShortValue,
 -                                  sizeof(USHORT));
 -    }
 +    }
 +
 +    return TRUE;
   }
   FORCEINLINE