X86: Actually handle 16 bit mode modrm.
This commit is contained in:
parent
93cccf7d19
commit
5f164ba720
1 changed files with 26 additions and 1 deletions
|
@ -79,7 +79,32 @@ void EmulEnv::doModRM(const ExtMachInst & machInst)
|
|||
index = NUM_INTREGS;
|
||||
} else {
|
||||
if (machInst.addrSize == 2) {
|
||||
warn("I'm not really using 16 bit MODRM like I'm supposed to!\n");
|
||||
unsigned rm = machInst.modRM.rm;
|
||||
if (rm <= 3) {
|
||||
scale = 1;
|
||||
if (rm < 2) {
|
||||
base = INTREG_RBX;
|
||||
} else {
|
||||
base = INTREG_RBP;
|
||||
}
|
||||
index = (rm % 2) ? INTREG_RDI : INTREG_RSI;
|
||||
} else {
|
||||
scale = 0;
|
||||
switch (rm) {
|
||||
case 4:
|
||||
base = INTREG_RSI;
|
||||
break;
|
||||
case 5:
|
||||
base = INTREG_RDI;
|
||||
break;
|
||||
case 6:
|
||||
base = INTREG_RBP;
|
||||
break;
|
||||
case 7:
|
||||
base = INTREG_RBX;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
scale = 0;
|
||||
base = machInst.modRM.rm | (machInst.rex.b << 3);
|
||||
|
|
Loading…
Reference in a new issue