Recursion 用汇编语言计算递归函数
我试图在汇编上实现以下函数,作为递归函数调用Recursion 用汇编语言计算递归函数,recursion,assembly,x86,procedure,Recursion,Assembly,X86,Procedure,我试图在汇编上实现以下函数,作为递归函数调用 Int f(n) if (n<=3) return n; else return 2 * f(n-1) + f(n-2); intf(n) 如果(n包括Irvine32.inc .代码 主进程 mov ecx,7 推ecx 调用递归 通话记录 呼叫Crlf 出口 主端 ;------------------------------ 递归过程 ;计算整数f(n) ;如果(n3? 是的,继续 mov eax,[ebp+8]
Int f(n)
if (n<=3) return n;
else return 2 * f(n-1) + f(n-2);
intf(n)
如果(n包括Irvine32.inc
.代码
主进程
mov ecx,7
推ecx
调用递归
通话记录
呼叫Crlf
出口
主端
;------------------------------
递归过程
;计算整数f(n)
;如果(n3?
是的,继续
mov eax,[ebp+8];否,返回1
jmp L2;返回到调用方
L1:dec eax
推送eax
调用递归
返回事实:shl eax,1
推送eax
mov eax,[ebp+8]
副eax,2
推送eax
调用递归
添加eax,[ebp-4]
L2:mov esp,ebp
弹出ebp;返回eax
ret 4;清除堆栈
递归ENDP
端干管
[ebp+16]
是一种糟糕的做法,即使它可能有效。您试图访问调用者的局部变量。您正在使用ebx
进行计算,但随后放弃了结果,因此您只能返回mov eax,1
。我如何修复它?我的逻辑实现正确吗?ebp
不是ebx
,而且也不是popping任何结果。不,您的逻辑是错误的。如果查看伪代码,您会发现需要调用f()
两次。将第一次调用的返回值存储在局部变量中(需要从堆栈中分配)然后使用该本地值和第二次调用的返回值执行计算。问题出在哪里?完全一样,只是n-2
。我添加了以下内容**-dec eax-add ebx,eax-mov eax,ebx**但是这次,不是只添加函数eax值f(n-2)(n-2)我的问题是,我应该在返回事实下再次调用递归吗?或者在哪里需要得到f(n-2)值
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
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