4 votes

Pourquoi le MUL 8 bits se combine-t-il à AX alors que les MUL 16 et 32 bits laissent leur résultat partagé entre [E]DX :[E]AX ?

  • MUL CL CL est la taille du BYTE et est égal à AX = AL * CL

  • MUL BX BX est de taille WORD et est égal à DX:AX = AX * BX

  • MUL EBX EBX est la taille du DWORD et est égal à EDX:EAX = EAX * EBX

Je veux savoir pourquoi la taille de 8 bits MUL L'instruction donne le résultat en AX et non dans DL:AL ?

Est-ce parce que pour le MUL 16 bits, le résultat peut être EAX pour un résultat MUL 32 bits, le résultat peut être RAX mais pour 64 bits mul rcx il n'y aurait pas un seul registre assez large pour contenir le résultat ?

7voto

Nate Eldredge Points 2185

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X