Next: Calling mechanism
Up: Using Assembly language
Previous: Intel syntax
Free Pascal uses the gnu as assembler to generate its object files for
the Intel Ix86 processors . Since
the gnu assembler uses AT&T assembly syntax, the code you write should
use the same syntax. The differences between AT&T and Intel syntax as used
in Turbo Pascal are summarized in the following:
- The opcode names include the size of the operand. In general, one can
say that the AT&T opcode name is the Intel opcode name, suffixed with a
'l', 'w' or 'b' for, respectively, longint (32 bit),
word (16 bit) and byte (8 bit) memory or register references. As an example,
the Intel construct 'mov al bl is equivalent to the AT&T style 'movb
%bl,%al' instruction.
- AT&T immediate operands are designated with '$', while Intel syntax
doesn't use a prefix for immediate operands. Thus the Intel construct
'mov ax, 2' becomes 'movb $2, %al' in AT&T syntax.
- AT&T register names are preceded by a '%' sign.
They are undelimited in Intel syntax.
- AT&T indicates absolute jump/call operands with '*', Intel
syntax doesn't delimit these addresses.
- The order of the source and destination operands are switched. AT&T
syntax uses 'Source, Dest', while Intel syntax features 'Dest,
Source'. Thus the Intel construct 'add eax, 4' transforms to
'addl $4, %eax' in the AT&T dialect.
- Immediate long jumps are prefixed with the 'l' prefix. Thus the
Intel 'call/jmp section:offset' is transformed to 'lcall/ljmp
$section,$offset'. Similarly the far return is 'lret', instead of the
Intel 'ret far'.
- Memory references are specified differently in AT&T and Intel
assembly. The Intel indirect memory reference
Section:[Base + Index*Scale + Offs]
is written in AT&T syntax as :
Section:Offs(Base,Index,Scale)
Where Base and Index are optional 32-bit base and index
registers, and Scale is used to multiply Index. It can take the
values 1,2,4 and 8. The Section is used to specify an optional section
register for the memory operand.
More information about the AT&T syntax can be found in the as manual,
although the following differences with normal AT&T assembly must be taken
into account :
The AT&T inline assembler supports the following macros :
- __RESULT
- represents the function result return value.
- __SELF
- represents the object method pointer in methods.
- __OLDEBP
- represents the old base pointer in recusrive routines.
Next: Calling mechanism
Up: Using Assembly language
Previous: Intel syntax
Michael Van Canneyt
Thu Sep 10 14:04:11 CEST 1998