Рекурсивная функция в сборке x86 - PullRequest
0 голосов
/ 30 мая 2011
 int stirling(int n,int k)
  {

     if((n==0)&&(k==0))
           return 1;

     else if((n>=1)&&(k>0))
             return stirling(n-1,k-1)-(n-1)*stirling(n-1,k);

     else if(n>0)
            return 0;

    return 0;           
  }

Я пытаюсь написать эту функцию в сборке x86 и не могу понять, как вызвать функцию return stirling(n-1,k-1)-(n-1)*stirling(n-1,k);

У кого-нибудь есть идея или она может мне помочь?

Спасибо.

1 Ответ

2 голосов
/ 30 мая 2011

Не отличается от любой другой функции, которая вызывает эту функцию.Абсолютно ничего особенного в рекурсии, просто реализуйте C как обычно.

n и k в основном локальные переменные, вам нужно локальное хранилище для текущего экземпляра этих переменных.Стек - хорошее место для этого.Или регистры, которые сохраняются в стеке при вызове любой функции.(опять же, ничего особенного, решение связано не с рекурсией, а со стандартной реализацией C).

ldr r0,[sp-#N_OFFSET]
sub r0,#1
ldr r1,[sp-#K_OFFSET]
sub r1,#1
bl stirling
ldr r1,[sp-#N_OFFSET]
sub r1,#1
sub r4,r0,r1
ldr r0,[sp-#N_OFFSET]
sub r0,#1
ldr r1,[sp-#K_OFFSET]
push r4
bl stirling
pop r4
signed multiply r0=r4*r0
clean up stack for return
bx lr

Нет, это не был ассемблер x86, я позволю вам перевести на x86.Если это домашнее задание, отметьте его как таковое или укажите, что это не домашнее задание в вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...