Free Pascal uses the gnu as assembler to generate its object les for the Intel Ix86 processors.
Since the gnu assembler uses AT&T assembly syntax, the code you write should use the same
syntax. The di erences 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, su xed 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
pre x 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 pre xed with the 'l' pre x. 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 speci ed di erently 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
di erences 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.