2017-10-07 2 views
0

J'essaie de faire une multiplication 32 bits. Je ne peux pas comprendre le problème. Réponse ne correspond pas avec la calculatriceAssemblage de multiplication 32 bits iApx88

[org 0x0100] 
mov cx,0 
mov cx,32 
mov dx,[multiplier] 
mov bx,[multiplier+2] 

check_bit: 
shr bx,1 
rcr dx,1 
jnc skip 
mov ax,[multiplicand+6] 
add [result+6],ax 
mov ax,[multiplicand+4] 
adc [result+4],ax 
mov ax,[multiplicand+2] 
adc [result+2],ax 
mov ax,[multiplicand] 
adc [result],ax 

skip: 
shl word[multiplicand+6],1 
rcl word[multiplicand+4],1 
rcl word[multiplicand+2],1 
rcl word[multiplicand],1 
dec cl 
jnz check_bit 

mov ax,0x4c00 
int 0x21 
multiplicand: dd 0x00000000 , 0x98765432 
multiplier: dd 0x12345678 
result: dd 0 , 0 
+0

_ne correspond pas à la description du problème. Quelle est votre contribution et la production attendue et réelle. En outre, apprenez à utiliser un débogueur et commentez votre code, surtout si vous voulez que les autres vous aident. PS: une raison particulière pour laquelle vous évitez l'instruction 'MUL'? – Jester

+0

Utilisez [edit] pour faire ceci a [mcve] –

Répondre

1

Des problèmes se posent parce que vous ne traitez pas vos numéros la façon dont ils sont stockés dans la mémoire.
Vous le faites bien pour le multiplicateur, mais pas pour le multiplicande ni le résultat!

Les valeurs sont stockées en mémoire dans format peu endian et donc la première addition se fait sur le mot le plus bas en mémoire, grimpant au plus haut mot:

mov ax,[multiplicand] 
add [result],ax 
mov ax,[multiplicand+2] 
adc [result+2],ax 
mov ax,[multiplicand+4] 
adc [result+4],ax 
mov ax,[multiplicand+6] 
adc [result+6],ax 

Même chose avec le doublement du multiplicande. Vous commencez au bas et insérez les FC dans chacun des mots plus élevés:

skip: 
    shl word[multiplicand],1 
    rcl word[multiplicand+2],1 
    rcl word[multiplicand+4],1 
    rcl word[multiplicand+6],1 

multiplicand: dd 0x00000000 , 0x98765432 

Il y a une bonne chance que ce multiplicande est pas ce que vous voulez?
Pour une multiplication 32 bits, cela a plus de sens!

multiplicand: dd 0x98765432 , 0x00000000