Рекурсивная функция Аккермана-Питера в сборке x86 (NASM) - PullRequest
1 голос
/ 02 июня 2011

Я пытаюсь реализовать рекурсивную функцию Аккермана-Петера в 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 сейчас, но все же получил ошибку сегментации. Я попытался отладить все это и поместил сообщение отладки в первый регистр. Я скомпилировал Программу и попробовал ее с n = 0 и m = 0, и он не печатает сообщение отладки, поэтому он даже не вводит первый регистр. Кажется, мне не удается понять, почему он этого не делает.

Вот моя текущая попытка: http://pastebin.com/D4jg7JGV

Ответы [ 2 ]

2 голосов
/ 03 июня 2011

РЕШЕНИЕ:

Хорошо, я нашел проблему:

Каким-то образом я не управлял ebp и esp не правильно. Я знаю, что использовал макросы ENTER и LEAVE в каждом вызове Funktion-Call, и теперь все работает правильно. Вот решение, спасибо за ваше время:

http://pastebin.com/ZpPucpcs

0 голосов
/ 02 июня 2011

Если вы согласны делать это рекурсивно (с учетом роста кадров стека), то это довольно просто.Основная идея, в коде подпрограммы:

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
...