0

階乗演算のサブルーチンを作成しています。値渡しにスタックを使用しているため、ローカル変数はすべてワードサイズです。

[ebp+4] is the counter/decrementing multiplier
[ebp-2] is the multiplicand

現在、次のようなコード ブロックがあります。

while1:

    cmp byte[ebp+4], 1
    je exit1
    dec word[ebp+4]
    mov ax, [ebp-2]
    mov dx, 0
    mul byte[ebp+4]
    mov word[ebp-2], ax

    jmp while1

そして、次の入出力結果があります。

1 -> 02561
2 -> 2
3 -> 6
4 -> 24
5 -> 120
6 -> 208
7 -> 176
8 -> 128

2 から 5 までしか正しくありません。バイト サイズの乗算を行っているのは のせいでmul byte[ebp+4]、6 の結果が妨げられていることに気付きました。= 720.だから私は次のように変更mul byte[ebp+4]しましたmul word[ebp+4]:

while1:

    cmp byte[ebp+4], 1
    je exit1
    dec word[ebp+4]
    mov ax, [ebp-2]
    mov dx, 0
    mul word[ebp+4]
    mov word[ebp-2], ax

    jmp while1

次に、次の入力および出力結果が得られます。

1 -> 02561
2 -> 07682
3 -> 28166
4 -> 62488
5 -> 46200
6 -> 60112
7 -> 35760
8 -> 15744

私は何を間違っていますか?mul操作の前にdxでクリア済みですが、正常に機能しないのはなぜですか?

注: stdout の ASCII で 5 文字までのワード サイズ変数の正しい印刷ルーチンがあります。また、私は 0 の特別なケースを持っています! 反復コード ブロックの前にcmpで実行されます。

Ubuntu 13 x86 と NASM を使用しています。


アップデート。while1のすぐ上にあるコード ブロックは次のとおりです。

fact: 

    mov ebp, esp
    sub esp, 2
    mov ax, [ebp+4]
    mov word[ebp-2], ax

    ; checks if num is zero
    cmp byte[ebp+4], 0
    je one
4

1 に答える 1