There is some trickery concerning the mul
and imul
instructions that deserves mention. The 16-, 32-, 64- and 128-bit expanding
multiplies (base opcode 0xf6
; extension 4 for mul
and 5
for imul
) can be output only in the one operand form. Thus,
imul %ebx, %eax
does not select the expanding multiply;
the expanding multiply would clobber the %edx
register, and this
would confuse gcc
output. Use imul %ebx
to get the
64-bit product in %edx:%eax
.
We have added a two operand form of imul
when the first operand
is an immediate mode expression and the second operand is a register.
This is just a shorthand, so that, multiplying %eax
by 69, for
example, can be done with imul $69, %eax
rather than imul
$69, %eax, %eax
.