0

我在使用移位来乘以用户给出的两个数字时遇到问题。它要求用户输入两个整数,并且应该将它们相乘。我的程序在询问整数方面效果很好,但是当它给出产品时,它是一个天文数字,几乎不正确。我哪里错了?它在读什么寄存器?

%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

4

2 回答 2

2

除了询问数字之外,您几乎在所有事情上都会出错。

  • 您的行为就像read_int将读取的整数写入input1第一次调用它并写入intput2第二次。几乎可以肯定情况并非如此。
  • 即使是这种情况,您也将第一个数字加载到 eax 中,然后立即用message2.
  • 即使 eax 和 ebx 正确加载了输入值,您的代码应该将两者相乘实际上是在按照“如果第二个数字非零,则将 eax 乘以 2。否则离开它独自的。”
  • 即使循环安排正确,它也会将 eax 乘以2 到ebx 的幂。
  • 然后你用无论如何的地址覆盖这个结果message3,所以这些都不重要。
  • 最后,无法确定从此代码打印的寄存器是什么。在这个问题和您的其他问题之间,您似乎期望print_int打印 eax、ebx 或 ecx 中的任何一个。
于 2011-03-19T21:54:55.937 回答
1

忽略您发布的代码,并严格查看如何将数字相乘(不使用乘法指令),您可以执行以下操作:

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
于 2011-03-19T22:38:33.180 回答