diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2010-05-26 16:08:23 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2010-05-26 16:08:23 +0000 |
commit | dfc8cf43a16e6e304c311bad583594485657cf8a (patch) | |
tree | 21b6d6efcf6d2b0556199073c2edf8a70819fb39 /opcodes/i386-dis.c | |
parent | 5e0f337e8c5e217a1560d89dac9719881272fd16 (diff) | |
download | gdb-dfc8cf43a16e6e304c311bad583594485657cf8a.zip gdb-dfc8cf43a16e6e304c311bad583594485657cf8a.tar.gz gdb-dfc8cf43a16e6e304c311bad583594485657cf8a.tar.bz2 |
Add SIB.
2010-05-26 H.J. Lu <hongjiu.lu@intel.com>
* i386-dis.c (sib): New.
(get_sib): Likewise.
(print_insn): Call get_sib.
OP_E_memory): Use sib.
Diffstat (limited to 'opcodes/i386-dis.c')
-rw-r--r-- | opcodes/i386-dis.c | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index fef9185..ecd8cca 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -2305,6 +2305,13 @@ modrm; static unsigned char need_modrm; static struct { + int scale; + int index; + int base; + } +sib; +static struct + { int register_specifier; int length; int prefix; @@ -11243,6 +11250,22 @@ get_valid_dis386 (const struct dis386 *dp, disassemble_info *info) return get_valid_dis386 (dp, info); } +static void +get_sib (disassemble_info *info) +{ + /* If modrm.mod == 3, operand must be register. */ + if (need_modrm + && address_mode != mode_16bit + && modrm.mod != 3 + && modrm.rm == 4) + { + FETCH_DATA (info, codep + 2); + sib.index = (codep [1] >> 3) & 7; + sib.scale = (codep [1] >> 6) & 3; + sib.base = codep [1] & 7; + } +} + static int print_insn (bfd_vma pc, disassemble_info *info) { @@ -11528,6 +11551,7 @@ print_insn (bfd_vma pc, disassemble_info *info) if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE) { + get_sib (info); dofloat (sizeflag); } else @@ -11535,6 +11559,7 @@ print_insn (bfd_vma pc, disassemble_info *info) dp = get_valid_dis386 (dp, info); if (dp != NULL && putop (dp->name, sizeflag) == 0) { + get_sib (info); for (i = 0; i < MAX_OPERANDS; ++i) { obufp = op_out[i]; @@ -12935,10 +12960,9 @@ OP_E_memory (int bytemode, int sizeflag) if (base == 4) { havesib = 1; - FETCH_DATA (the_info, codep + 1); - vindex = (*codep >> 3) & 7; - scale = (*codep >> 6) & 3; - base = *codep & 7; + vindex = sib.index; + scale = sib.scale; + base = sib.base; USED_REX (REX_X); if (rex & REX_X) vindex += 8; |