x86程序集(NASM)中的递归Ackermann-Peter函数



im试图在x86 NASM程序集中实现递归Ackermann-Peter函数。功能定义如下:

*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,但仍然存在Segmentation错误。我试着调试整件事,并在第一个案例中放置了一条调试消息。我编译了这个程序,并在n=0和m=0的情况下进行了尝试,但他没有打印调试消息,所以他甚至没有输入第一种情况。我似乎不知道他为什么不这么做

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

解决方案:

好的,我发现了问题:

我没有把ebp和esp处理好。所以,我现在在每个函数调用中都使用了ENTER和LEAVE宏,现在整个过程都正常工作了。这是解决方案。感谢您抽出时间:

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新