Рекурсивная функция Аккерманна-Питера в сборке x86 (NASM)
Я пытаюсь реализовать рекурсивную функцию Аккермана-Питера в NASM-сборке x86. Функция определяется следующим образом:
* a (0; m) = m + 1
* a (n + 1; 0) = a (n; 1)
* a (n + 1; m + 1)) = a (n; a (n + 1; m))
Моя проблема в том, что я даже не представляю, как начать правильно. К настоящему времени я реализовал только функцию "степень x" в ассемблере.
Вот что у меня есть: http://pastebin.com/rsWALyCq (на немецком языке просто спрашивают n и m)
Я благодарен за каждую помощь, которую я могу получить с этим.
-
Итак, я сделал Push / Pop Statements Symetric сейчас, но все еще получаю ошибку сегментации. Я попытался отладить все это и поместил сообщение отладки в первый регистр. Я скомпилировал Программу и попробовал ее с n=0 и m=0, и он не печатает сообщение отладки, поэтому он даже не вводит первый регистр. Я не могу понять, почему он этого не делает.
Вот моя текущая попытка: http://pastebin.com/D4jg7JGV
2 ответа
РЕШЕНИЕ:
Хорошо, я нашел проблему:
Каким-то образом я не управлял ebp и esp не правильно. Я знаю, что использовал макросы ENTER и LEAVE в каждом вызове Funktion-Call, и теперь все работает правильно. Вот решение, спасибо за ваше время:
Если вы можете делать это рекурсивно (с учетом роста кадров стеков), то это довольно просто. Основная идея в коде подпрограммы:
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