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 ’.