mul instruction don't give you the means to multiply ANY register, except EAX (or derivatives) by its operand... The result will always be in the pair EDX:EAX (or derivatives).
So, if you want to use mul to multiply ECX by the contents of memory (which, both must be the same size), you need to do:
mov eax,ecx
mul [es:edi+offset] ; 32 bits effective address.
; result is EDX:EAX = EAX * DWORD [ES:EDI+offset]
There is a more flexible multiplication instruction: imul, which takes the signal of the operands in account. This instruction can be used as MUL (using EAX as default source operand and results in EDX:EAX) or when using 2 operands, multiply the source by the second operand and storing the result in the source... There is a third option: the first operand can be the result of the second operand multiplied by a CONSTANT as a third operand:
imul ebx ; EDX:EAX = EAX * EBX
imul ebx,ecx ; EBX = EBX * ECX
imul ebx,ecx,3 ; EBX = ECX * 3
But it is important to notice IMUL will consider the values as SIGNED.