Unlike other simple arithmetic instructions, the unsigned MUL and DIV instructions have implicit destination registers. Furthermore, the bit-width of the destination depends on, and is different from, the source register. For the MUL operation:
MUL (8-bit register): Source AL (8 bits) -> Destination AX (16 bits)
MUL (16-bit register): Source AX (16 bits) -> Destination DX:AX (16-bit DX, 16-bits AX)
MUL (32-bit register): Source EAX (32 bits) -> Destination EDX:EAX (32-bit EDX, 32-bit EAX)
So, for 8-bit multiplies, the source is AL (8 bits) and the output is AX (16 bits). The ":" notation means that the bits are concatenated. Note that DX and EDX is not the same physical register as AX and EAX, so the result can span registers.
In addition to having an implicit destination, the DIV instruction has two outputs - a quotient and a remainder.
DIV (8-bit register): Source AX (16 bits) -> Destination Quotient AL (8 bits), Remainder AH (8 bits)
DIV (16-bit register): Source DX:AX (32 bits) -> Destination Quotient AX (16 bits), Remainder DX (16 bits)
DIV (32-bit register): Source EDX:EAX (64 bits) -> Destination Quotient EAX (32 bits), Remainder EDX (32 bits)
For reference, here's the layouts for the registers referenced above:
|----------------------------------------------------------------|
| <------------ EAX ------------->|
| <----- AX ----->|
| <- AH -><- AL ->|
|................................................................|
|----------------------------------------------------------------|
|----------------------------------------------------------------|
| <------------ EDX ------------->|
| <----- DX ----->|
|................................................................|
|----------------------------------------------------------------|
-- Giac Veltri (Senior Engine Programmer)