Fri Apr 24 16:07:57 1998 Alan Modra <alan@spri.levels.unisa.edu.au>
authorIan Lance Taylor <ian@airs.com>
Fri, 24 Apr 1998 20:09:22 +0000 (20:09 +0000)
committerIan Lance Taylor <ian@airs.com>
Fri, 24 Apr 1998 20:09:22 +0000 (20:09 +0000)
* i386-dis.c (OP_DSSI): Print segment override.

opcodes/ChangeLog
opcodes/i386-dis.c

index 9a3c034e2fc268584bc6b3635647cfa30b11c676..575aef38fa5746cd7b1c6aa28215f9aa08383e7d 100644 (file)
@@ -1,3 +1,7 @@
+Fri Apr 24 16:07:57 1998  Alan Modra  <alan@spri.levels.unisa.edu.au>
+
+       * i386-dis.c (OP_DSSI): Print segment override.
+
 start-sanitize-r5900
 Thu Apr 23 12:32:07 1998  Frank Ch. Eigler  <fche@cygnus.com>
 
index 7133337eead730a75409f6195876dd8b1842632c..63b7d9c6fbdcce042697e55846f596c775cf4d9f 100644 (file)
@@ -1,5 +1,5 @@
 /* Print i386 instructions for GDB, the GNU debugger.
-   Copyright (C) 1988, 89, 91, 93, 94, 95, 96, 1997
+   Copyright (C) 1988, 89, 91, 93, 94, 95, 96, 97, 1998
    Free Software Foundation, Inc.
 
 This file is part of GDB.
@@ -418,9 +418,9 @@ static struct dis386 dis386[] = {
   { "movS",    Ev, Gv },
   { "movb",    Gb, Eb },
   { "movS",    Gv, Ev },
-  { "movw",    Ew, Sw },
+  { "movS",    Ev, Sw },
   { "leaS",    Gv, M },
-  { "movw",    Sw, Ew },
+  { "movS",    Sw, Ev },
   { "popS",    Ev },
   /* 90 */
   { "nop" },
@@ -809,7 +809,7 @@ static const unsigned char twobyte_has_modrm[256] = {
   /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
   /* b0 */ 1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1, /* bf */
   /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
-  /* d0 */ 0,1,1,1,0,1,0,0,1,1,1,0,1,1,0,1, /* df */
+  /* d0 */ 0,1,1,1,0,1,0,0,1,1,0,1,1,1,0,1, /* df */
   /* e0 */ 0,1,1,0,0,1,0,0,1,1,0,1,1,1,0,1, /* ef */
   /* f0 */ 0,1,1,1,0,1,0,0,1,1,1,0,1,1,1,0  /* ff */
 };
@@ -1164,6 +1164,8 @@ int
 print_insn_x86 (pc, info, aflag, dflag)
      bfd_vma pc;
      disassemble_info *info;
+     int aflag;
+     int dflag;
 {
   struct dis386 *dp;
   int i;
@@ -1753,8 +1755,8 @@ OP_E (bytemode, aflag, dflag)
       int havesib;
       int havebase;
       int base;
-      int index;
-      int scale;
+      int index = 0;
+      int scale = 0;
 
       havesib = 0;
       havebase = 1;
@@ -1781,7 +1783,9 @@ OP_E (bytemode, aflag, dflag)
          break;
        case 1:
          FETCH_DATA (the_info, codep + 1);
-         disp = *(char *)codep++;
+         disp = *codep++;
+         if ((disp & 0x80) != 0)
+           disp -= 0x100;
          break;
        case 2:
          disp = get32 ();
@@ -1818,14 +1822,22 @@ OP_E (bytemode, aflag, dflag)
        {
        case 0:
          if (rm == 6)
-           disp = (short) get16 ();
+           {
+             disp = get16 ();
+             if ((disp & 0x8000) != 0)
+               disp -= 0x10000;
+           }
          break;
        case 1:
          FETCH_DATA (the_info, codep + 1);
-         disp = *(char *)codep++;
+         disp = *codep++;
+         if ((disp & 0x80) != 0)
+           disp -= 0x100;
          break;
        case 2:
-         disp = (short) get16 ();
+         disp = get16 ();
+         if ((disp & 0x8000) != 0)
+           disp -= 0x10000;
          break;
        }
 
@@ -1989,16 +2001,24 @@ OP_sI (bytemode, aflag, dflag)
     {
     case b_mode:
       FETCH_DATA (the_info, codep + 1);
-      op = *(char *)codep++;
+      op = *codep++;
+      if ((op & 0x80) != 0)
+       op -= 0x100;
       break;
     case v_mode:
       if (dflag)
        op = get32 ();
       else
-       op = (short)get16();
+       {
+         op = get16();
+         if ((op & 0x8000) != 0)
+           op -= 0x10000;
+       }
       break;
     case w_mode:
-      op = (short)get16 ();
+      op = get16 ();
+      if ((op & 0x8000) != 0)
+       op -= 0x10000;
       break;
     default:
       oappend ("<internal disassembler error>");
@@ -2022,14 +2042,18 @@ OP_J (bytemode, aflag, dflag)
     {
     case b_mode:
       FETCH_DATA (the_info, codep + 1);
-      disp = *(char *)codep++;
+      disp = *codep++;
+      if ((disp & 0x80) != 0)
+       disp -= 0x100;
       break;
     case v_mode:
       if (dflag)
        disp = get32 ();
       else
        {
-         disp = (short)get16 ();
+         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!  */
@@ -2090,7 +2114,11 @@ OP_DIR (size, aflag, dflag)
       if (aflag)
        offset = get32 ();
       else
-       offset = (short)get16 ();
+       {
+         offset = get16 ();
+         if ((offset & 0x8000) != 0)
+           offset -= 0x10000;
+       }
       
       offset = start_pc + codep - start_codep + offset;
       set_op (offset);
@@ -2145,7 +2173,16 @@ OP_DSSI (dummy, aflag, dflag)
      int aflag;
      int dflag;
 {
-  oappend ("%ds:(");
+  if ((prefixes
+       & (PREFIX_CS
+         | PREFIX_DS
+         | PREFIX_SS
+         | PREFIX_ES
+         | PREFIX_FS
+         | PREFIX_GS)) == 0)
+    prefixes |= PREFIX_DS;
+  append_prefix ();
+  oappend ("(");
   oappend (aflag ? "%esi" : "%si");
   oappend (")");
   return (0);