This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: Why aren't we consistent on displacement in x86 disassembler?
- From: "H. J. Lu" <hjl at lucon dot org>
- To: binutils at sources dot redhat dot com
- Date: Thu, 26 Apr 2007 07:49:29 -0700
- Subject: Re: Why aren't we consistent on displacement in x86 disassembler?
- References: <20070426135749.GA9666@lucon.org>
On Thu, Apr 26, 2007 at 06:57:49AM -0700, H. J. Lu wrote:
> While working on
>
> http://sourceware.org/bugzilla/show_bug.cgi?id=4429
>
> I noticed that we weren't consistent in the format we use on
> displacement:
>
> ----
> static void
> print_operand_value (char *buf, int hex, bfd_vma disp)
> ...
> static void
> OP_E (int bytemode, int sizeflag)
> {
> ...
> print_operand_value (scratchbuf, !riprel, disp);
> ...
> print_operand_value (scratchbuf, modrm.mod != 1, disp);
> ...
> print_operand_value (scratchbuf, 1, disp);
> ...
> print_operand_value (scratchbuf, 0, disp);
> ...
> print_operand_value (scratchbuf, modrm.mod != 1, disp);
> ...
> print_operand_value (scratchbuf, 1, disp & 0xffff);
> }
> ----
>
> That is we use hex or decimal for displacement, depending on Intel
> mode, RIP relative, modrm.mod != 1 and 16bit address mode. It is
> confusing. Are there any objections if I use hex for all displacements?
I guess that the intend was for 8bit displacement, we use decimal and
for 16/32bit displacement, we use hex. But we didn't do it correctly:
bash-3.1$ cat y.s
mov 12(%rip), %eax
mov 12(%r12), %eax
bash-3.1$ gcc -c y.s
bash-3.1$ objdump -d y.o
y.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <.text>:
0: 8b 05 0c 00 00 00 mov 12(%rip),%eax # 0x12
6: 41 8b 44 24 0c mov 0xc(%r12),%eax
We can do one of
1. Use decimal on all 8bit displacements and hex on all 16/32bit
displacement.
2. Use hex on all displacements.
Any comments?
H.J.