Le 8086 avait des registres de 16 bits (AX, BX, ...). Ainsi, une multiplication par élargissement 8*8=16 (c'est-à-dire avec des entrées de 8 bits et un résultat de 16 bits) pouvait faire tenir son résultat dans un seul registre. Le répartir sur deux registres aurait été peu pratique et n'aurait apporté aucun avantage.
Mais la multiplication par élargissement 16*16=32 ne pouvait pas faire tenir son résultat dans un seul registre, car il n'y avait pas de registres 32 bits. Par nécessité, elle devait être répartie sur deux registres, et DX et AX ont été choisis.
De même, le 386 avait des registres de 32 bits (EAX, EBX, ...), de sorte que son multiplicateur d'élargissement 32*32=64 devait avoir son résultat divisé. EDX:EAX ont été choisis pour leur similarité avec le 8086.
Intel aurait pu à ce moment-là ajouter une nouvelle version du MUL 16*16=32 qui laissait son résultat dans un seul registre 32 bits tel que EAX, mais il a choisi de ne pas le faire, peut-être par souci de compatibilité ou pour éviter une complexité supplémentaire inutile, ou par simple inertie. Ainsi, le 16*16=32 du 386 MUL
laisse toujours son résultat réparti sur DX:AX, même en mode 32 bits.
(Ils ont toutefois ajouté une forme non élargissante 32*32=32 de la multiplication signée. IMUL
qui laisse son résultat dans un seul registre de 32 bits. On peut l'utiliser pour une multiplication signée 16*16=32 en étendant le signe des entrées, pour laquelle l'instruction pratique MOVSX
a également été ajouté. Et il peut être utilisé pour la multiplication non signée 16*16=32, en étendant à zéro les entrées, si l'on sait que le produit sera inférieur à 2^31
.)
De même, x86-64 avait des registres de 64 bits. Pour les instructions de multiplication existantes, le comportement est resté le même (ainsi, 32*32=64 divise toujours son résultat entre EDX:EAX au lieu d'utiliser un seul registre 64 bits), et ils ont ajouté un multiplicateur élargissant 64*64=128 qui, là encore, doit diviser son résultat et le laisse dans RDX:RAX. Et il y a aussi un multiplicateur non élargissant 64*64=64 signé. IMUL
qui laisse son résultat dans un seul registre de 64 bits.