gpt4 book ai didi

assembly - assembly 中的斐波那契实现给出了意想不到的结果

转载 作者:行者123 更新时间:2023-12-01 02:42:28 32 4
gpt4 key购买 nike

我正在尝试编写斐波那契的汇编代码版本,它给出第 n 个斐波那契数并返回它。

出于某种原因,它在存储斐波那契数的返回值和添加它们时遇到问题。

我希望它打印第 n 个斐波那契数。

我对我的代码做了一些修改,现在它仍然不正确,但它更接近了。现在它告诉我第 11 个斐波那契数是 48。仍然不正确,但我们找到了正确的地方?

.text

.globl _fibonacci
_fibonacci:
pushl %ebp
movl %esp,%ebp
push %esi
movl 8(%ebp),%esi

cmp $1,%esi
jle BASE
sub $1,%esi
push %esi
call _fibonacci
add $4,%esp
movl %eax,%edx
sub $1,%esi
push %esi
call _fibonacci
add $4,%esp
add %eax,%edx
movl %edx,%eax

DONE:
pop %esi
pop %ebp
ret

BASE:
mov $1,%eax
jmp DONE

我正在使用 C 调用此汇编代码:
#include <stdio.h>

int fibonacci(int n);

int main(void){
int n=111;
int x=fibonacci(n);
printf("The %d fibonaacci number is %d\n",n,x);
}

最佳答案

您的递归调用正在破坏 %edx .您需要pushl %edx在你的序言和 popl %edx在你的后记中,像这样:

.text

.globl _fibonacci
/* fib(n) = fib(n-1) + fib(n-2) */
_fibonacci:
pushl %ebp
movl %esp,%ebp
pushl %esi
pushl %edx /* <-- PUSH TO SAVE BEFORE CLOBBERING */
movl 8(%ebp),%esi

/* 0th and 1st numbers are defined to be 1. */
cmpl $1,%esi
jle BASE

/* find fib(n-1) */
subl $1,%esi
pushl %esi
call _fibonacci

addl $4,%esp
movl %eax,%edx /* <-- %edx CLOBBERED! */

/* find fib(n-2) */
subl $1,%esi
pushl %esi
call _fibonacci

addl $4,%esp
addl %edx,%eax

DONE:
popl %edx /* <-- POP TO RESTORE AFTER CLOBBERING */
popl %esi
popl %ebp
ret

BASE:
movl $1,%eax
jmp DONE

使用此驱动程序:
// BUILD -arch i386 ONLY
// clang -arch i386 fib.s fibo.c -o fibo
#include <stdio.h>

int fibonacci(int n);

void Test(int i) {
int r = fibonacci(i);
printf("fib(%d) -> %d\n", i, r);
}

int main(void){
for (int i = 0; i < 10; ++i) {
Test(i);
}
return 0;
}

测试运行看起来像:
$ ./fibo 
fib(0) -> 1
fib(1) -> 1
fib(2) -> 2
fib(3) -> 3
fib(4) -> 5
fib(5) -> 8
fib(6) -> 13
fib(7) -> 21
fib(8) -> 34
fib(9) -> 55

关于assembly - assembly 中的斐波那契实现给出了意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7863397/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com