Умножение с использованием сдвигов в сборке. Но вывести слишком большое число! Куда я иду не так? - PullRequest
0 голосов
/ 19 марта 2011

У меня проблемы с использованием смен для умножения двух чисел, заданных пользователем.Он просит пользователя ввести два целых числа и должен их умножить.Моя программа хорошо работает с запросом целых чисел, но когда она дает продукт, это астрономическое число, которое почти не является правильным.Куда я иду не так?какой регистр он читает?

%include "asm_io.inc"
segment .data</p>

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

<p>segment .bss</p>

<p>input1 resd 1
input2 resd 1</p>

<p>segment .text
    Global main
main:
    enter 0,0
    pusha</p>

<pre><code>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

Ответы [ 2 ]

2 голосов
/ 20 марта 2011

Вы ошибаетесь практически во всем, кроме запроса чисел.

  • Вы действуете как read_int записывает целое число чтения в input1 при первом вызове и в intput2 во второй раз.Это почти наверняка не так.
  • Даже в этом случае вы загружаете первое число в eax, а затем сразу перезаписываете его адресом message2.
  • Даже если eax иebx были правильно загружены с входными значениями, ваш код, который должен умножать два, фактически делает что-то вроде «если второе число ненулевое, умножьте eax на 2. В противном случае оставьте это в покое».
  • Даже если бы цикл был расположен правильно, он умножил бы eax на 2 до степени ebx.
  • Тогда вы все равно перезапишете этот результат адресом message3, так что ничего из этого не имеет значения.
  • В конце концов, невозможно определить, какой регистр печатается из этого кода.Между этим вопросом и другим вопросом вы, похоже, ожидаете, что print_int напечатает любой из eax, ebx или ecx.
1 голос
/ 20 марта 2011

Игнорируя опубликованный вами код и строго следя за тем, как умножать числа (без использования инструкции умножения), вы делаете что-то вроде этого:

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
...