Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion 用汇编语言计算递归函数_Recursion_Assembly_X86_Procedure - Fatal编程技术网

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