8.12.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.