x86emu: Respect the LEA 67h address size prefix.
Signed-off-by: Christian Zander <chzander@nvidia.com> Signed-off-by: Aaron Plattner <aplattner@nvidia.com> Tested-by: Tiago Vignatti <tiago.vignatti@nokia.com> Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
parent
2984c18eb9
commit
f57bc0ede8
|
@ -6567,42 +6567,62 @@ Handles opcode 0x8d
|
||||||
static void x86emuOp_lea_word_R_M(u8 X86EMU_UNUSED(op1))
|
static void x86emuOp_lea_word_R_M(u8 X86EMU_UNUSED(op1))
|
||||||
{
|
{
|
||||||
int mod, rl, rh;
|
int mod, rl, rh;
|
||||||
u16 *srcreg;
|
|
||||||
uint destoffset;
|
uint destoffset;
|
||||||
|
|
||||||
/*
|
|
||||||
* TODO: Need to handle address size prefix!
|
|
||||||
*
|
|
||||||
* lea eax,[eax+ebx*2] ??
|
|
||||||
*/
|
|
||||||
|
|
||||||
START_OF_INSTR();
|
START_OF_INSTR();
|
||||||
DECODE_PRINTF("LEA\t");
|
DECODE_PRINTF("LEA\t");
|
||||||
FETCH_DECODE_MODRM(mod, rh, rl);
|
FETCH_DECODE_MODRM(mod, rh, rl);
|
||||||
switch (mod) {
|
switch (mod) {
|
||||||
case 0:
|
case 0:
|
||||||
srcreg = DECODE_RM_WORD_REGISTER(rh);
|
if (M.x86.mode & SYSMODE_PREFIX_ADDR) {
|
||||||
DECODE_PRINTF(",");
|
u32 *srcreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
destoffset = decode_rm00_address(rl);
|
DECODE_PRINTF(",");
|
||||||
DECODE_PRINTF("\n");
|
destoffset = decode_rm00_address(rl);
|
||||||
TRACE_AND_STEP();
|
DECODE_PRINTF("\n");
|
||||||
*srcreg = (u16)destoffset;
|
TRACE_AND_STEP();
|
||||||
|
*srcreg = (u32)destoffset;
|
||||||
|
} else {
|
||||||
|
u16 *srcreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
|
DECODE_PRINTF(",");
|
||||||
|
destoffset = decode_rm00_address(rl);
|
||||||
|
DECODE_PRINTF("\n");
|
||||||
|
TRACE_AND_STEP();
|
||||||
|
*srcreg = (u16)destoffset;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
srcreg = DECODE_RM_WORD_REGISTER(rh);
|
if (M.x86.mode & SYSMODE_PREFIX_ADDR) {
|
||||||
DECODE_PRINTF(",");
|
u32 *srcreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
destoffset = decode_rm01_address(rl);
|
DECODE_PRINTF(",");
|
||||||
DECODE_PRINTF("\n");
|
destoffset = decode_rm01_address(rl);
|
||||||
TRACE_AND_STEP();
|
DECODE_PRINTF("\n");
|
||||||
*srcreg = (u16)destoffset;
|
TRACE_AND_STEP();
|
||||||
|
*srcreg = (u32)destoffset;
|
||||||
|
} else {
|
||||||
|
u16 *srcreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
|
DECODE_PRINTF(",");
|
||||||
|
destoffset = decode_rm01_address(rl);
|
||||||
|
DECODE_PRINTF("\n");
|
||||||
|
TRACE_AND_STEP();
|
||||||
|
*srcreg = (u16)destoffset;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
srcreg = DECODE_RM_WORD_REGISTER(rh);
|
if (M.x86.mode & SYSMODE_PREFIX_ADDR) {
|
||||||
DECODE_PRINTF(",");
|
u32 *srcreg = DECODE_RM_LONG_REGISTER(rh);
|
||||||
destoffset = decode_rm10_address(rl);
|
DECODE_PRINTF(",");
|
||||||
DECODE_PRINTF("\n");
|
destoffset = decode_rm10_address(rl);
|
||||||
TRACE_AND_STEP();
|
DECODE_PRINTF("\n");
|
||||||
*srcreg = (u16)destoffset;
|
TRACE_AND_STEP();
|
||||||
|
*srcreg = (u32)destoffset;
|
||||||
|
} else {
|
||||||
|
u16 *srcreg = DECODE_RM_WORD_REGISTER(rh);
|
||||||
|
DECODE_PRINTF(",");
|
||||||
|
destoffset = decode_rm10_address(rl);
|
||||||
|
DECODE_PRINTF("\n");
|
||||||
|
TRACE_AND_STEP();
|
||||||
|
*srcreg = (u16)destoffset;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 3: /* register to register */
|
case 3: /* register to register */
|
||||||
/* undefined. Do nothing. */
|
/* undefined. Do nothing. */
|
||||||
|
|
Loading…
Reference in New Issue