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=…
==============================================================================
--- 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);
}
}