x86: AT&T syntax operand size defaults

H.J. Lu hjl.tools@gmail.com
Mon Oct 16 11:24:00 GMT 2017


On Mon, Oct 16, 2017 at 3:09 AM, Jan Beulich <JBeulich@suse.com> wrote:
>>>> On 13.10.17 at 23:51, <hjl.tools@gmail.com> wrote:
>> On 10/13/17, Jan Beulich <JBeulich@suse.com> wrote:
>>> All,
>>>
>>> according to the only reasonable document about AT&T assembler
>>> syntax (Solaris'es / Oracles "x86 Assembly Language Reference
>>> Manual", operand size is supposed to default to "long".
>>>
>>> However, of these two
>>>
>>>      add     $1, (%eax)
>>>      add     $0x1234, (%eax)
>>>
>>> the first indeed defaults to "long" (except in 16-bit mode, but I think
>>> that's fine despite what that doc says) while the second causes an
>>> error. That's because of
>>>
>>>        if (i.tm.opcode_modifier.w)
>>>          {
>>>            as_bad (_("no instruction mnemonic suffix given and "
>>>                      "no register operands; can't size instruction"));
>>>            return 0;
>>>          }
>>>
>>> in process_suffix(): The pattern for the 8-bit sign extended
>>> immediate does no have W set, while most other instructions
>>> allowing for no register operands at all have it set. I'm of the
>>> strong opinion that the behavior of the assembler should at least
>>> be consistent, i.e. in particular it should not depend on the value
>>> of an immediate.
>>>
>>> Which way to make it consistent, though, I'm not sure about:
>>> It could be made match Intel syntax behavior, where an error is
>>> being flagged whenever multiple operand sizes are permitted for
>>> a mnemonic (that's imo the model most helpful to the programmer),
>>> or it could be made match that doc by simply removing the as_bad()
>>> invocation above (which is the model accepting the widest set of
>>> originally non-gas sources). Of course it would be possible to have
>>> the user select between the two by command line option and/or
>>> directive, but even then we would need to settle on what default
>>> behavior should be.
>>
>> I agreed that AT&T syntax is poorly documented.   As for this specific
>> case, I am OK with either option as long as it doesn't break existing
>> codes.
>
> Interesting requirement: How do you define "existing codes"? I
> certainly realize that regressions aren't nice, but in particular
> when going the error-on-ambiguity route this at least wouldn't
> go silent. Obviously changing the (silently selected) default for
> certain insns / operand combinations would be more dangerous
> in this regard. I don't, however, think such a change can come
> without the risk of people having written bogus code now
> needing to fix it.
>

It depends on how extensive these bogus codes are.  If Linux kernel
needs to be changed, you should fix them in kernel 4.xx branches first
before committing assembler changes.

-- 
H.J.



More information about the Binutils mailing list