8.8.2 AT&T Syntax versus Intel Syntax
In order to maintain compatibility with the output of gcc
,
as
supports AT&T System V/386 assembler syntax. This is quite
different from Intel syntax. We mention these differences because
almost all 80386 documents used only 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.
-
In AT&T syntax the size of memory operands is determined from the last
character of the opcode name. Opcode suffixes of `b', `w',
and `l' specify byte (8-bit), word (16-bit), and long (32-bit)
memory references. Intel syntax accomplishes this by prefixes memory
operands (not the opcodes themselves) with `byte ptr',
`word ptr', and `dword ptr'. Thus, Intel `mov al, byte
ptr foo' is `movb foo, %al' in AT&T syntax.
-
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
instruction
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.
This document was generated
by root on January, 30 2002
using texi2html