我已经尝试用C语言编写了一个简单的控制台程序(使用clang作为编译器),它将使用内联汇编来计算输入到标准输入中的索引的斐波那契数。
#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个斐波纳契数)。你知道错误在哪里吗?
发布于 2017-12-30 18:51:34
看起来您需要将计数检查移到循环块的开始处,而不是结束处,因为您在结束时进行检查,所以您会比您想要的多一次循环。或者在进入循环之前使用dec 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"https://stackoverflow.com/questions/48033089
复制相似问题