Section 04 Part 08 – The MULU & MULS Instructions “But I was thinking of a way To multiply by ten, And always, in the answer, get The question back again.” ~Lewis Carroll

Introduction

These two instructions are for multiplication, and there are two of them because one is for unsigned and the other is for signed.

The MULU Instruction

MULU – Unsigned MULtiply

This instruction will multiply a word of the destination operand by the word of the source operand; the result is saved in long-word in the destination operand.

Examples

This is pretty much simple multiplication right here.  So, we’ll start with this:

 mulu.w    #\$0010,d0

We’ll pretend that d0 contains 00200040 for this example.

What happens is the word of d0 is read (0040) and is multiplied by 0010.

 0040 x 0010 = 00000400

The result is then saved into d0, and now d0 contains 00000400.  You’ll notice the 0020 that was in the upper word of d0 was replaced and ignored entirely, be sure to keep that in mind.

We’ll have another example, this time d0 contains FFFFF800:

 mulu.w    #\$0087,d0

The word of d0 (F800) is multiplied by 0087.

 F800 x 0087 = 0082C800

The result is then saved into d0, and now d0 contains 0082C800.  Remember, MULU is unsigned multiplication, so both F800 and 0087 are treated as unsigned numbers (positive).

The destination operand must be a data register; the source operand however, can be an immediate number, a data register, a memory address, or even a memory address using an address register.  A few examples:

 mulu.w    d1,d0           mulu.w    \$00000010,d0           mulu.w    (a0),d0

In all of these examples above, the word of the d0, is multiplied by a word of the source operands.  And the result is always a long-word saved back into d0.

The only thing you cannot use for the source operand is an address register directly:

 mulu.w    a0,d0

And one final note, the size can only be word, you cannot use byte or long-word.

The MULS Instruction

MULS – Signed MULtiply

This is exactly the same as the MULU instruction (including syntax rules).  Except of course, the source and destination are both treated as “signed” instead of “unsigned”.  So numbers that are from 8000 to FFFF are negative.

Examples

We’ll pretend that d0 contains 0000FFC0 in this example.

 muls.w    #\$0010,d0

So, the word FFC0 from d0 is multiplied by the word 0010.

 FFC0 x 0010 = FFFFFC00

Notice how the FFC0 is treated a negative, while 0010 is positive.  What you effectively have is:

 -0040 x +0010 = -00000400

And so, d0 now contains FFFFFC00 (-400).

That is the only difference between MULU and MULS.