рекурсия в программе asm - PullRequest
       20

рекурсия в программе asm

0 голосов
/ 15 ноября 2011

У меня вопрос о программе asm (x86 / GAS), которая возвращает ошибку сегментации.Речь идет о Фибоначчи: я думаю, что алгоритм в порядке: (псевдокод)

fibo(int number){
    if (n < 2)
        return number;
    return fib(n - 1) + fib(n - 2);

Я не понимаю, почему возникает ошибка.Программа AC вызывает функцию asm.

Вот код:

fibo:
    movl    4(%esp), %ebx    #argument n in %ebx
    cmpl    $2, %ebx          # test: is n < 2 ?
    jnl     recur            # no, recursion

    jmp     quit             # yes : quit

recur:


    movl    %ebx, %eax  # get value of argument n
    subl    $1, %eax     # n-1
    pushl   %eax        # push n-1
    call    fibo        # recursive call : fib(n-1)
    movl    %eax, %edx  # save result in  %edx
    movl    %ebx, %eax  # get value of argument n
    subl    $2, %eax     # n-2
    pushl   %eax        # push n-2
    call    fibo        # recursive call : fib(-2)
    addl    %edx, %eax  # add fib(n-1) + fib(n-2)

Можете ли вы помочь мне найти, где находится segfault?

спасибо!

PS: вот рет:

quit:   movl    %ecx, %eax  #result in %ecx
        ret

Ответы [ 2 ]

3 голосов
/ 15 ноября 2011
  1. Как вы вернетесь из своей функции?
  2. Ожидаете ли вы, что ваш call сохранит значения в регистрах?

Ответы помогут вам найти решение.

1 голос
/ 15 ноября 2011

Как уже отмечали другие, вы не показываете свои инструкции по отступлению, что важно. Также вы сохраняете промежуточный результат добавления в edx. Это не сработает - рекурсивный вызов, который следует, также сделает это и изменит значение, которое вы имели на этом уровне вызова. Вам также нужно сохранить это промежуточное значение в стеке.

...