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