2011-03-19 2 views
0

J'ai des problèmes avec l'utilisation de décalages pour multiplier deux nombres donnés par l'utilisateur. Il demande à l'utilisateur d'entrer deux entiers et il est supposé les multiplier. Mon programme fonctionne bien en demandant les nombres entiers, mais quand il donne le produit c'est un nombre astronomique non où c'est proche. Où est-ce que je me trompe? quel registre lit-il?Multiplication à l'aide de décalages dans l'assemblage. Mais obtenir un nombre trop élevé nombre dehors! Où vais-je mal?

%include "asm_io.inc" 
segment .data

message1 db "Enter a number: ", 0 message2 db "Enter another number: ", 0 message3 db "The product of these two numbers is: ", 0

segment .bss

input1 resd 1 input2 resd 1

segment .text Global main main: enter 0,0 pusha

mov  eax, message1 ; print out first message 
call print_string 
call read_int ; input first number 
mov  eax, [input1] 


mov  eax, message2 ; print out second message 
call print_string 
call read_int ; input second number 
mov ebx, [input2] 

cmp  eax, 0  ; compares eax to zero 
cmp ebx, 0  ; compares ebx to zero 
jnz LOOP  ; 

LOOP:
SHL eax, 1

dump_regs 1 mov eax, message3 ; print out product call print_string mov ebx, eax call print_int

+1

s'il vous plaît formater votre code un peu plus lisiblement . à première vue, je ne vois rien qui ressemble à une multiplication (il y a un décalage de 1 par 1, pas en boucle), je ne vois même pas où vous agissez sur les valeurs d'entrée en dehors des tests 'ebx' contre zéro. – Mat

+0

qu'est-ce qui n'est pas lisible à ce sujet? – BDilly

+0

Votre code n'a pas beaucoup de sens, et ne semble pas contenir quoi que ce soit ressemblant à une tentative de multiplication. Y a-t-il eu, peut-être, une erreur dans le fait de couper/coller? –

Répondre

2

Vous allez mal dans à peu près tout en plus pour demander les numéros.

  • Vous agissez comme read_int écrit l'entier de lecture en input1 la première fois qu'il est appelé et en intput2 la deuxième fois. Ce n'est presque certainement pas le cas.
  • Même si c'était le cas, vous chargiez le premier numéro dans eax, puis vous le remplaciez immédiatement par l'adresse message2.
  • Même si eax et ebx ont été chargés correctement avec les valeurs d'entrée, votre code qui est supposé multiplier les deux est en train de faire quelque chose comme "si le second nombre est différent de zéro, multipliez eax par 2. Sinon, laissez-le tranquille. "
  • Même si la boucle était correctement organisée, elle multipliait eax par 2 à la puissance de ebx.
  • Ensuite, vous écrasez ce résultat avec l'adresse de message3 de toute façon, donc rien de tout cela n'a d'importance. En fin de compte, il est impossible de déterminer quel registre est imprimé à partir de ce code. Entre cette question et your other question, vous semblez attendre print_int pour imprimer eax, ebx ou ecx.
1

Ignorant le code que vous avez posté, et en regardant strictement sur la façon de multiplier les nombres (sans utiliser une instruction de multiplication), vous faites quelque chose comme ceci:

mult proc 
; multiplies eax by ebx and places result in edx:ecx 
    xor ecx, ecx 
    xor edx, edx 
mul1: 
    test ebx, 1 
    jz mul2 
    add ecx, eax 
    adc edx, 0 
mul2: 
    shr ebx, 1 
    shl eax, 1 
    test ebx, ebx 
    jnz mul1 
done: 
    ret 
mult endp 
Questions connexes