使用C中的内联汇编计算Fibonacci序列

问题描述 投票:1回答:1

我试图在C中创建一个简单的控制台程序(使用clang作为编译器),它将使用内联汇编来计算Fibonacci的数字,并使用在标准输入中输入的索引。

#include <stdio.h>

int main()
{
  int ulaz;
  scanf("%d",&ulaz);
  int rezultat;
  asm(
"mov %1,%%ecx\n"
".intel_syntax\n"
"mov eax,0\n"
"mov ebx,1\n"
"petlja:\n"
"add eax,ebx\n"
"xchg eax,ebx\n"
"loop petlja\n"
".att_syntax\n"
"mov %%ebx,%0\n"
: "=m" (rezultat)
: "m" (ulaz)
);
  printf("%d\n",rezultat);
  return 0;
}

它似乎计算斐波纳契数,但不是用户输入的索引。例如,对于输入“10”,它应输出“55”(第10个斐波纳契数),但它输出“89”(这是斐波纳契数,但不是第10个斐波那契数)。知道错误在哪里?

c inline-assembly
1个回答
2
投票

看起来您需要将计数检查移动到循环块的开头而不是结束,这是因为您在结束时进行了检查,因此您需要再次进行循环检查。进入循环之前的那个或者是ec ecx。

将支票移至乞讨将是类似的(未检查,只是说明):

"mov %1,%%ecx\n"
".intel_syntax\n"
"mov eax,0\n"
"mov ebx,1\n"
loop_start:\n"
"test ecx, ecx\n"
"jz loop_done"
"add eax,ebx\n"
"xchg eax,ebx\n"
"dec ecx\n"
"jmp loop_start\n"
"loop_done:\n"
".att_syntax\n"
"mov %%ebx,%0\n"
© www.soinside.com 2019 - 2024. All rights reserved.