as
now supports assembly using Intel assembler syntax.
.intel_syntax
selects Intel mode, and .att_syntax
switches
back to the usual AT&T mode for compatibility with the output of
gcc
. Either of these directives may have an optional
argument, prefix
, or 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:
$
; 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.
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.
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
syntax.
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
.