8.13.2 AT&T Syntax versus Intel Syntax
as now supports assembly using Intel assembler syntax.
.intel_syntax selects Intel mode, and
back to the usual AT&T mode for compatibility with the output of
gcc. Either of these directives may have an optional
noprefix specifying whether registers
require a `%' prefix. AT&T System V/386 assembler syntax is quite
different from Intel syntax. We mention these differences because
almost all 80386 documents use Intel syntax. Notable differences
between the two syntaxes are:
- AT&T immediate operands are preceded by `$'; Intel immediate
operands are undelimited (Intel `push 4' is AT&T `pushl $4').
AT&T register operands are preceded by `%'; Intel register operands
are undelimited. AT&T absolute (as opposed to PC relative) jump/call
operands are prefixed by `*'; they are undelimited in Intel syntax.
- AT&T and Intel syntax use the opposite order for source and destination
operands. Intel `add eax, 4' is `addl $4, %eax'. The
`source, dest' convention is maintained for compatibility with
previous Unix assemblers. Note that instructions with more than one
source operand, such as the `enter' instruction, do not have
reversed order. i386-Bugs.
- In AT&T syntax the size of memory operands is determined from the last
character of the instruction mnemonic. Mnemonic suffixes of `b',
`w', `l' and `q' specify byte (8-bit), word (16-bit), long
(32-bit) and quadruple word (64-bit) memory references. Intel syntax accomplishes
this by prefixing memory operands (not the instruction mnemonics) with
`byte ptr', `word ptr', `dword ptr' and `qword ptr'. Thus,
Intel `mov al, byte ptr foo' is `movb foo, %al' in AT&T
- Immediate form long jumps and calls are
`lcall/ljmp $section, $offset' in AT&T syntax; the
Intel syntax is
`call/jmp far section:offset'. Also, the far return
is `lret $stack-adjust' in AT&T syntax; Intel syntax is
`ret far stack-adjust'.
- The AT&T assembler does not provide support for multiple section
programs. Unix style systems expect all programs to be single sections.