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@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