2010-07-18 21 views
3

En principe, la valeur d'élévation au carré d'un registre n'est pas difficile:Intel 8086 Assemblée - Squaring un registre

mov ax, [var] 
mov cx, [var] 
mul cx   // square of answer is in DX:AX 

Mais je suis arrivé à penser - le cours que je suis Assemblée d'apprentissage pour l'efficacité des prix très fortement; une différence de moins d'une seule ligne pourrait valoir jusqu'à 5 points.

Je sais que c'est micro-optimisation, mais je le code suivant effectuer la même ?:

mov ax, [var] 
mul ax   // is answer still in DX:AX ? 

Je suppose que d'une manière beaucoup plus simple d'exprimer ma question: est-AX (ou AL/AH) un paramètre valide pour les commandes mul et imul dans l'assembly 8086?

+0

Merci pour le formatage du code, GregS. J'ai glissé dans mon esprit. –

Répondre

3

Oui, mul ax met ax*ax à dx:ax.

1

Vous pouvez utiliser mul ax DX: AX = AX * AX mais notez que dans ce cas, vous perdrez la valeur que vous aviez dans AX, donc si vous avez besoin d'utiliser cette valeur à nouveau parfois il est préférable d'utiliser l'option mul bx, car BX reste intacte.

De plus, si vous utilisez mul al ou (mul ah) vous ne ferez pas AX = AX AX mais AX = AL AL (ou AX = AL * AH) donc si la valeur dans AX est plus grande que 255 Ne faites pas une multiplication de AX car vous ignorez complètement et écrasez la partie supérieure de la valeur (vous ignorez AH).