2016-10-01 2 views
0

Je voudrais multiplier bx et cx, mais il ne marche pas fonctionne comme j'utiliser la hachemultiplier bx et cx [ASM 8086]

mov ax,0AFh 
mov cx,0AFh 
mul cx 

mon essai à multiplier bx et cx

mov bx,Ah 
mov cx,5h 
mul cx 
"???????" 

Pour en multipliant bx et cx je pense que je dois utiliser un registre temp. Quelqu'un peut-il me montrer comment faire cela?

+1

Dans 'mov bx, Ah', la source est le registre AH, pas une constante immédiate. Peut-être que vous vouliez dire "0Ah"? Aussi, lisez simplement le manuel de http://www.felixcloutier.com/x86/MUL.html, ou toute autre instruction qui ne répond pas à vos attentes. Voir aussi les liens dans le [wiki du tag x86] (http://stackoverflow.com/tags/x86/info) –

+0

@Shift_Left: La question dit 8086, mais 'imul r16, r/m16' n'a été introduit qu'avec 386. Le le résultat n'est pas vraiment signé ou non signé: seule la moitié supérieure du résultat complet diffère. Deux opérandes IMUL définissent des drapeaux basés sur des éléments signés, mais sinon, il n'y a pas besoin de MUL si vous n'avez pas besoin de la moitié supérieure du résultat. IMUL est certainement le bon choix si vous ne devez pas réellement cibler le matériel ancien (ou emu8086). –

+0

@PeterCordes J'ai supprimé mon commentaire car il était complètement hors contexte. Je n'aurais jamais pensé que j'allais tirer ** The 8086 Book ** de mon étagère que j'ai acheté il y a 39 ans. –

Répondre

0

pour cette solution:

mov bx, 0Ah 
mov cx, 5h 
push ax 
mov ax, bx 
mul cx 
mov bx, ax 
pop ax 
;at this point, ax is unchanged, result is in bx. 

Ou, si vous voulez être de fantaisie, essayez ceci:

mov bx, 0Ah 
mov cx, 5h 
xchg ax, bx 
mul cx 
xchg ax, bx 
;at this point, ax is unchanged, result is in bx. 

Cependant, la multiplication par un registre 16 bits laissera ses résultats en dx:ax . Puisque votre exemple multiplie les petits nombres, cela n'a pas vraiment d'importance, car le résultat entier tiendra dans un registre de 16 bits. Cependant, sachez que votre registre dx sera effacé par ces fragments de code, et si vous multipliez des nombres plus importants à l'avenir, veillez à rechercher le résultat dans dx:bx.

+1

Toutes les formes de mul/imul produisent le résultat complet. http://www.felixcloutier.com/x86/MUL.html. 'mul r/m8' le met dans AX, mais tout le reste le met dans [RE] DX: [RE] AX –

+0

@PeterCordes merci pour la clarification. Donc, en multipliant par plus de 8 bits, 'dx' en obtient toujours un pour l'équipe. –

+0

@PeterCordes Je l'ai réparé. –