This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
PATCH: Fix i8086 disassembler for 16bit displacements
- From: "H. J. Lu" <hjl at lucon dot org>
- To: binutils at sources dot redhat dot com
- Date: Fri, 2 Feb 2007 16:37:37 -0800
- Subject: PATCH: Fix i8086 disassembler for 16bit displacements
OP_J masked displacement to 16bit for all 16bit displacements. It
should do it only when there is a data16 prefix. I am checking in this
patch to fix it.
H.J.
---
ld/testsuite/
2076-02-02 H.J. Lu <hongjiu.lu@intel.com>
* ld-i386/pcrel16.d: Updated.
* ld-x86-64/pcrel16.d: Likewise.
opcodes/
2076-02-02 H.J. Lu <hongjiu.lu@intel.com>
* i386-dis.c (OP_J): Only mask to 16bit if there is a data16
prefix.
--- binutils/ld/testsuite/ld-i386/pcrel16.d.disp 2006-01-18 13:07:49.000000000 -0800
+++ binutils/ld/testsuite/ld-i386/pcrel16.d 2007-02-02 15:22:36.000000000 -0800
@@ -12,4 +12,4 @@ Disassembly of section .text:
420: cd 42[ ]+int \$0x42
422: ca 02 00[ ]+lret \$0x2
...
- f065: e9 b8 13[ ]+jmp 420 <_start\+0x420>
+ f065: e9 b8 13[ ]+jmp 10420 <__bss_start\+0x3b8>
--- binutils/ld/testsuite/ld-x86-64/pcrel16.d.disp 2005-08-03 09:30:34.000000000 -0700
+++ binutils/ld/testsuite/ld-x86-64/pcrel16.d 2007-02-02 15:24:38.000000000 -0800
@@ -12,4 +12,4 @@ Disassembly of section .text:
420: cd 42[ ]+int \$0x42
422: ca 02 00[ ]+lret \$0x2
...
- f065: e9 b8 13[ ]+jmp 420 <_start\+0x420>
+ f065: e9 b8 13[ ]+jmp 10420 <_start\+0x10420>
--- binutils/opcodes/i386-dis.c.disp 2007-02-02 13:50:51.000000000 -0800
+++ binutils/opcodes/i386-dis.c 2007-02-02 14:34:00.000000000 -0800
@@ -4916,10 +4916,13 @@ OP_J (int bytemode, int sizeflag)
else
{
disp = get16 ();
+ if ((disp & 0x8000) != 0)
+ disp -= 0x10000;
/* For some reason, a data16 prefix on a jump instruction
means that the pc is masked to 16 bits after the
displacement is added! */
- mask = 0xffff;
+ if ((prefixes & PREFIX_DATA))
+ mask = 0xffff;
}
used_prefixes |= (prefixes & PREFIX_DATA);
break;