Opcode names are suffixed with one character modifiers which specify the
size of operands. The letters `b', `w', and `l' specify
byte, word, and long operands. If no suffix is specified by an
instruction and it contains no memory operands then as
tries to
fill in the missing suffix based on the destination register operand
(the last one by convention). Thus, `mov %ax, %bx' is equivalent
to `movw %ax, %bx'; also, `mov $1, %bx' is equivalent to
`movw $1, %bx'. Note that this is incompatible with the AT&T Unix
assembler which assumes that a missing opcode suffix implies long
operand size. (This incompatibility does not affect compiler output
since compilers always explicitly specify the opcode suffix.)
Almost all opcodes have the same names in AT&T and Intel format. There are a few exceptions. The sign extend and zero extend instructions need two sizes to specify them. They need a size to sign/zero extend from and a size to zero extend to. This is accomplished by using two opcode suffixes in AT&T syntax. Base names for sign extend and zero extend are `movs...' and `movz...' in AT&T syntax (`movsx' and `movzx' in Intel syntax). The opcode suffixes are tacked on to this base name, the from suffix before the to suffix. Thus, `movsbl %al, %edx' is AT&T syntax for "move sign extend from %al to %edx." Possible suffixes, thus, are `bl' (from byte to long), `bw' (from byte to word), and `wl' (from word to long).
The Intel-syntax conversion instructions
are called `cbtw', `cwtl', `cwtd', and `cltd' in
AT&T naming. as
accepts either naming for these instructions.
Far call/jump instructions are `lcall' and `ljmp' in AT&T syntax, but are `call far' and `jump far' in Intel convention.