1

我试图在 x86 NASM-Assembly 中实现递归 Ackermann-Peter-Function。函数定义如下:

*a(0;m) = m + 1

*a(n + 1; 0) = a(n; 1)

*a(n + 1;m + 1)) = a(n;a(n + 1;m))

我的问题是我什至无法想象如何正确启动。到目前为止,我只在 Assembly 中递归地实现了“x 的幂”函数。

这是我到目前为止所拥有的:http: //pastebin.com/rsWALyCq(德语提示只要求输入 n 和 m)

我很感谢我能得到的每一点帮助。

--

所以我现在做了 push/pop Statements Symetric,但仍然出现分段错误。我试图调试整个事情,并在第一个案例中放置了一个 Debug-Message。我编译了程序并使用 n=0 和 m=0 进行了尝试,并且没有打印调试消息,所以他甚至没有进入第一种情况。我似乎无法弄清楚为什么他不这样做。

这是我目前的尝试: http: //pastebin.com/D4jg7JGV

4

2 回答 2

2

解决方案:

好的,我发现了问题:

我没有正确管理 ebp 和 esp。所以,我现在在每个函数调用中都使用了 ENTER 和 LEAVE 宏,现在整个事情都正常工作了。这是解决方案。感谢您的时间:

asm_main:
    ENTER 0,0               ;setup Routine
    PUSHA
    MOV eax, prompt1        ;ask for n

完整代码: http: //pastebin.com/ZpPucpcs

于 2011-06-03T08:37:11.257 回答
0

如果您可以递归地执行此操作(所有伴随的堆栈帧增长),那么这相当简单。基本思想,在子程序的代码中:

ACKERMANN
Get n and m off the stack or from registers
Compare n to zero.
If it is equal, jump to FIRSTCASE
Compare m to zero
If it is equal, jump to SECONDCASE
put n + 1 into the first argument slot
put m into the second argument slot
call ACKERMANN
put n into the first argument slot
put the return of previous call into second argument slot
call ACKERMANN
put the return of the previous call into the return register/stack slot
return

FIRSTCASE
put m+1 in the return register/stack slot
return

SECONDCASE
Put n into the first argument slot
put 1 into the second argument slot
call ACKERMANN
put the return of previous call into return register/stack slot
return
于 2011-06-02T16:27:40.340 回答