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