Author: aandrejevic Date: Mon Apr 20 02:22:56 2015 New Revision: 67322
URL: http://svn.reactos.org/svn/reactos?rev=67322&view=rev Log: [FAST486] Fix ENTER and LEAVE in the same way I fixed PUSH and POP in the previous 2 commits.
Modified: trunk/reactos/lib/fast486/opcodes.c
Modified: trunk/reactos/lib/fast486/opcodes.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/fast486/opcodes.c?rev=6... ============================================================================== --- trunk/reactos/lib/fast486/opcodes.c [iso-8859-1] (original) +++ trunk/reactos/lib/fast486/opcodes.c [iso-8859-1] Mon Apr 20 02:22:56 2015 @@ -4405,16 +4405,24 @@ if (NestingLevel > 0) Fast486StackPush(State, FramePointer.Long);
/* Set EBP to the frame pointer */ - State->GeneralRegs[FAST486_REG_EBP] = FramePointer; + if (Size) State->GeneralRegs[FAST486_REG_EBP].Long = FramePointer.Long; + else State->GeneralRegs[FAST486_REG_EBP].LowWord = FramePointer.LowWord;
/* Reserve space for the frame */ - if (Size) State->GeneralRegs[FAST486_REG_ESP].Long -= (ULONG)FrameSize; - else State->GeneralRegs[FAST486_REG_ESP].LowWord -= FrameSize; + if (State->SegmentRegs[FAST486_REG_SS].Size) + { + State->GeneralRegs[FAST486_REG_ESP].Long -= (ULONG)FrameSize; + } + else + { + State->GeneralRegs[FAST486_REG_ESP].LowWord -= FrameSize; + } }
FAST486_OPCODE_HANDLER(Fast486OpcodeLeave) { BOOLEAN Size = State->SegmentRegs[FAST486_REG_CS].Size; + ULONG Value;
/* Make sure this is the right instruction */ ASSERT(Opcode == 0xC9); @@ -4422,26 +4430,22 @@ NO_LOCK_PREFIX(); TOGGLE_OPSIZE(Size);
- if (Size) + if (State->SegmentRegs[FAST486_REG_SS].Size) { /* Set the stack pointer (ESP) to the base pointer (EBP) */ State->GeneralRegs[FAST486_REG_ESP].Long = State->GeneralRegs[FAST486_REG_EBP].Long; - - /* Pop the saved base pointer from the stack */ - Fast486StackPop(State, &State->GeneralRegs[FAST486_REG_EBP].Long); - } - else - { - ULONG Value; - + } + else + { /* Set the stack pointer (SP) to the base pointer (BP) */ State->GeneralRegs[FAST486_REG_ESP].LowWord = State->GeneralRegs[FAST486_REG_EBP].LowWord; - - /* Pop the saved base pointer from the stack */ - if (Fast486StackPop(State, &Value)) - { - State->GeneralRegs[FAST486_REG_EBP].LowWord = LOWORD(Value); - } + } + + /* Pop the saved base pointer from the stack */ + if (Fast486StackPop(State, &Value)) + { + if (Size) State->GeneralRegs[FAST486_REG_EBP].Long = Value; + else State->GeneralRegs[FAST486_REG_EBP].LowWord = LOWORD(Value); } }