0

シフトを使用して、ユーザーが指定した 2 つの数値を乗算する際に問題が発生しています。ユーザーに2つの整数を入力するように求め、それらを乗算することになっています。私のプログラムは整数を求める際にはうまく機能しますが、積を与えると、それは天文学的な数であり、正しいとは言えません。どこが間違っていますか?それは何のレジスタを読んでいますか?

%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

数字を求める以外に、ほとんどすべてのことで間違っています。

  • あなたは、最初に呼び出されたときと2回目read_intに読み込まれた整数を書き込むように振る舞っています。これはほぼ確実に当てはまりません。input1intput2
  • その場合でも、最初の数値を eax にロードし、すぐに のアドレスで上書きしますmessage2
  • eax と ebx が入力値で正しくロードされたとしても、2 つを乗算することになっているコードは、実際には「2 番目の数値がゼロでない場合、eax に 2 を掛けます。そうでない場合はそのままにしておきます。 1人。"
  • ループが正しく配置されていたとしても、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 に答える