This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]