as: i386-Variations

 
 9.15.3.1 AT&T Syntax versus Intel Syntax
 ........................................
 
 '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:
 
    * 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 'bound', 'invlpga', and
      instructions with 2 immediate operands, such as the 'enter'
      instruction, do _not_ have reversed order.  Seei386-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 syntax.
 
      In 64-bit code, 'movabs' can be used to encode the 'mov'
      instruction with the 64-bit displacement or immediate operand.
 
    * 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.