2017-07-04 27 views
-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 
+1

をアドバイスしてください[EBP + 16]は'それがうまくいくかもしれない場合でも、悪い習慣です。呼び出し元のローカル変数にアクセスしようとしています。あなたは 'ebx'を使って計算していますが、結果を破棄するので、' mov eax、1'だけが返ってきます。 – Jester

+0

どうすれば修正できますか?私のロジックは正しく実装されていますか? – mwater07

+0

'ebp'は' ebx'ではありません。また、結果がポップしていません。いいえ、あなたの論理は間違っています。擬似コードを見ると、 'f()' ** **を2回呼び出す必要があることがわかります。最初の呼び出しからの戻り値をローカル変数(スタックから割り当てる必要がある)に格納し、そのローカルと2番目の呼び出しの戻り値を使用して計算を実行します。 – Jester

答えて

0
INCLUDE Irvine32.inc 
.CODE 
main PROC 
    mov ecx, 7 
    push ecx 
    call RECURSIVE  
    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,[ebp+8]    ; no, return 1 
jmp L2      ;return to the caller 
L1: dec eax 
    push eax 
    call RECURSIVE 

ReturnFact: shl eax,1 
      push eax 
      mov eax, [ebp+8] 
      sub eax, 2  
      push eax 
      call RECURSIVE 
      add eax, [ebp-4] 
L2: mov esp, ebp 
    pop ebp     ;return eax 
    ret 4     ;clear stack 
RECURSIVE ENDP 

END main 
関連する問題