【问题标题】:How to do a recursive call with a stack function in MASM assembly如何在 MASM 程序集中使用堆栈函数进行递归调用
【发布时间】:2022-01-13 18:37:23
【问题描述】:

我正在开发一个程序来计算斐波那契数列的前七个值。我得到了一些 C 来作为基础,但我不确定我所拥有的一切是否正确。这只是我第二次在 MASM 中使用堆栈执行程序,我不确定我所做的是否正确。 这是我在 C 中得到的:

//Fibonacci Series using Recursion
#include<stdio.h>
int fib(int n)
{
   if (n <= 1)
      return n;
   return fib(n-1) + fib(n-2);
}
 
int main ()
{
  int n = 9;
  int result = fib(n);
  return 0;
}

这就是我在 MASM 中所拥有的。我有正确的堆栈调用吗?

INCLUDE Irvine32.inc

ExitProcess proto,dwExitCode:dword
.data
nValue DWORD 9
val DWORD 0
.code
fib PROC
    push ebp
    mov ebp, esp
    sub esp, 12
    mov EAX, [EBP+12]
    mov [EBP-8], ECX

    cmp ECX, 1 ;compare if greater than 1
    JG L1 
    L1: mov esp, ebp
        pop ebp
        ret
    JG L2
        L2: sub ecx, 1
        sub ecx, 2
        mov val, ecx
        push val
        call fib
     
fib ENDP

main PROC
    mov ecx, nValue
    push nValue
    call fib
main ENDP
END main

【问题讨论】:

  • 您在fibmain 的末尾都缺少ret 语句,并且您在fib 中的结语放错了位置。
  • 另外,JG L1; L1:JG L2; L2: 都没有做任何有用的事情。

标签: assembly x86 masm32


【解决方案1】:

有很多错误和误解

  • val 变量没用
  • 您使用输入参数和局部变量是错误的。更好的方法是让汇编器做他的工作。您可以像这样定义输入参数和局部变量。所有序言和结语代码都由汇编程序以正确的方式插入。请通过任何调试器检查最终代码。
 fib PROC param1:DWORD
    本地 localVar:DWORD

    mov EAX, 参数 1
    mov localVar, EAX
    ……
    ret
    纤维ENDP
  • 在 main 结束时还缺少 ExitProcess 调用。
  • 斐波那契数的递归计算也是错误的。
  • 其他错误 - 缺少 ret,并且已经提到了错误的条件跳转。

【讨论】:

    猜你喜欢
    • 2019-09-30
    • 2018-10-03
    • 2019-05-05
    • 1970-01-01
    • 2018-12-19
    • 2020-03-08
    • 2023-04-11
    • 2014-03-20
    • 1970-01-01
    相关资源
    最近更新 更多