196 lines
2.5 KiB
C
196 lines
2.5 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1994 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
stackops.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module implements the code to emulate the push, pop, pushf, popf,
|
|||
|
pusha, popa, pushSeg, and popSeg.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
David N. Cutler (davec) 6-Sep-1994
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
Kernel mode only.
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "nthal.h"
|
|||
|
#include "emulate.h"
|
|||
|
|
|||
|
VOID
|
|||
|
XmPushOp (
|
|||
|
IN PRXM_CONTEXT P
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function emulates a push opcode.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
P - Supplies a pointer to the emulation context structure.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
//
|
|||
|
// Push source value onto stack.
|
|||
|
//
|
|||
|
|
|||
|
XmPushStack(P, P->SrcValue.Long);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
XmPopOp (
|
|||
|
IN PRXM_CONTEXT P
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function emulates a pop opcode.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
P - Supplies a pointer to the emulation context structure.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
//
|
|||
|
// Pop the stack and store the result value.
|
|||
|
//
|
|||
|
|
|||
|
XmStoreResult(P, XmPopStack(P));
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
XmPushaOp (
|
|||
|
IN PRXM_CONTEXT P
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function emulates a pusha opcode.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
P - Supplies a pointer to the emulation context structure.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
ULONG Index;
|
|||
|
ULONG Temp;
|
|||
|
|
|||
|
//
|
|||
|
// Push all registers onto the stack.
|
|||
|
//
|
|||
|
|
|||
|
if (P->OpsizePrefixActive != FALSE) {
|
|||
|
P->DataType = LONG_DATA;
|
|||
|
|
|||
|
} else {
|
|||
|
P->DataType = WORD_DATA;
|
|||
|
}
|
|||
|
|
|||
|
Index = EAX;
|
|||
|
Temp = P->Gpr[ESP].Exx;
|
|||
|
do {
|
|||
|
if (Index == ESP) {
|
|||
|
XmSetSourceValue(P, (PVOID)&Temp);
|
|||
|
|
|||
|
} else {
|
|||
|
XmSetSourceValue(P, (PVOID)(&P->Gpr[Index].Exx));
|
|||
|
}
|
|||
|
|
|||
|
XmPushOp(P);
|
|||
|
Index += 1;
|
|||
|
} while (Index <= EDI);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
XmPopaOp (
|
|||
|
IN PRXM_CONTEXT P
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function emulates a popa opcode.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
P - Supplies a pointer to the emulation context structure.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
ULONG Index;
|
|||
|
ULONG Temp;
|
|||
|
|
|||
|
//
|
|||
|
// Pop all register from the stack, but skip over ESP.
|
|||
|
//
|
|||
|
|
|||
|
if (P->OpsizePrefixActive != FALSE) {
|
|||
|
P->DataType = LONG_DATA;
|
|||
|
|
|||
|
} else {
|
|||
|
P->DataType = WORD_DATA;
|
|||
|
}
|
|||
|
|
|||
|
Index = EDI + 1;
|
|||
|
Temp = P->Gpr[ESP].Exx;
|
|||
|
do {
|
|||
|
Index -= 1;
|
|||
|
if (Index == ESP) {
|
|||
|
XmSetDestinationValue(P, (PVOID)&Temp);
|
|||
|
|
|||
|
} else {
|
|||
|
XmSetDestinationValue(P, (PVOID)(&P->Gpr[Index].Exx));
|
|||
|
}
|
|||
|
|
|||
|
XmPopOp(P);
|
|||
|
} while (Index > EAX);
|
|||
|
return;
|
|||
|
}
|