Node:i386-Jumps, Next:i386-Float, Previous:i386-Memory, Up:i386-Dependent
Jump instructions are always optimized to use the smallest possible
displacements. This is accomplished by using byte (8-bit) displacement
jumps whenever the target is sufficiently close. If a byte displacement
is insufficient a long displacement is used. We do not support
word (16-bit) displacement jumps in 32-bit mode (i.e. prefixing the jump
instruction with the data16
instruction prefix), since the 80386
insists upon masking %eip
to 16 bits after the word displacement
is added. (See also see i386-Arch)
Note that the jcxz
, jecxz
, loop
, loopz
,
loope
, loopnz
and loopne
instructions only come in byte
displacements, so that if you use these instructions (gcc
does
not use them) you may get an error message (and incorrect code). The AT&T
80386 assembler tries to get around this problem by expanding jcxz foo
to
jcxz cx_zero jmp cx_nonzero cx_zero: jmp foo cx_nonzero: