-1
アセンブリで再帰関数呼び出しとして以下の関数を実装しようとしています。アセンブリ言語で再帰関数を計算する
Int f(n)
if (n<=3) return n;
else return 2 * f(n-1) + f(n-2);
コードを実行すると、結果として1が返されます。 `
INCLUDE Irvine32.inc
.CODE
main PROC
push 5
call RECURSIVE ; calculate the below function
call WriteDec
call Crlf
exit
main ENDP
;------------------------------
RECURSIVE PROC
; Calculates int f(n)
; if (n<=3) returns n
; else return 2*f(n-1)+f(n-2)
;------------------------------
push ebp
mov ebp,esp
mov eax,[ebp+8] ;get n
cmp eax,3 ;n > 3 ?
ja L1 ; yes, continue
mov eax,1 ; no, return 1
jmp L2 ;return to the caller
L1: dec eax
push eax
call RECURSIVE
ReturnFact:mov ebx,[ebp+8] ;get n-1
shl ebx,1 ;multiply by 2
add ebx,[ebp+16] ;add n-2 and save
L2: pop ebp ;return eax
ret 4 ;clear stack
RECURSIVE ENDP
END main
をアドバイスしてください[EBP + 16]は'それがうまくいくかもしれない場合でも、悪い習慣です。呼び出し元のローカル変数にアクセスしようとしています。あなたは 'ebx'を使って計算していますが、結果を破棄するので、' mov eax、1'だけが返ってきます。 – Jester
どうすれば修正できますか?私のロジックは正しく実装されていますか? – mwater07
'ebp'は' ebx'ではありません。また、結果がポップしていません。いいえ、あなたの論理は間違っています。擬似コードを見ると、 'f()' ** **を2回呼び出す必要があることがわかります。最初の呼び出しからの戻り値をローカル変数(スタックから割り当てる必要がある)に格納し、そのローカルと2番目の呼び出しの戻り値を使用して計算を実行します。 – Jester