Node:i386-Prefixes, Next:i386-Memory, Previous:i386-Regs, Up:i386-Dependent
Instruction prefixes are used to modify the following instruction. They
are used to repeat string instructions, to provide section overrides, to
perform bus lock operations, and to change operand and address sizes.
(Most instructions that normally operate on 32-bit operands will use
16-bit operands if the instruction has an "operand size" prefix.)
Instruction prefixes are best written on the same line as the instruction
they act upon. For example, the scas
(scan string) instruction is
repeated with:
repne scas %es:(%edi),%al
You may also place prefixes on the lines immediately preceding the
instruction, but this circumvents checks that as
does
with prefixes, and will not work with all prefixes.
Here is a list of instruction prefixes:
cs
, ds
, ss
, es
,
fs
, gs
. These are automatically added by specifying
using the section:memory-operand form for memory references.
data16
and addr16
change 32-bit operands/addresses into 16-bit operands/addresses,
while data32
and addr32
change 16-bit ones (in a
.code16
section) into 32-bit operands/addresses. These prefixes
must appear on the same line of code as the instruction they
modify. For example, in a 16-bit .code16
section, you might
write:
addr32 jmpl *(%ebx)
lock
inhibits interrupts during execution of
the instruction it precedes. (This is only valid with certain
instructions; see a 80386 manual for details).
wait
waits for the coprocessor to
complete the current instruction. This should never be needed for the
80386/80387 combination.
rep
, repe
, and repne
prefixes are added
to string instructions to make them repeat %ecx
times (%cx
times if the current address size is 16-bits).
rex
family of prefixes is used by x86-64 to encode
extensions to i386 instruction set. The rex
prefix has four
bits -- an operand size overwrite (64
) used to change operand size
from 32-bit to 64-bit and X, Y and Z extensions bits used to extend the
register set.
You may write the rex
prefixes directly. The rex64xyz
instruction emits rex
prefix with all the bits set. By omitting
the 64
, x
, y
or z
you may write other
prefixes as well. Normally, there is no need to write the prefixes
explicitly, since gas will automatically generate them based on the
instruction operands.