我已经在6502程序集中编写了一个计算斐波那契数的函数。我正在C中调用该函数,然后将这两个文件都编译为6502的单个二进制文件。但是我得到的输出是不同的。斐波那契10为55,但输出2649。它计算数字的斐波那契而不是0到10范围之间的整数。例如,斐波那契0为257,对于1为258,对于10为2649,并且以此类推。为什么我会得到这样的输出。
我的C代码:“ main.c”
#include<stdio.h>
int fib();
int main() {
unsigned int p = fib();
printf("%u\n",p);
return 0;
}
fib()是6502汇编中的外部函数,它与C代码链接在一起。
我的6502代码:“ fib.s”
fib:
//calculates fibonacci
然后我用cl65 -t sim6502 main.c fib.s -o fib
答案 0 :(得分:6)
您遗漏了fib.s
的代码。
最有可能的是编译器期望一个16位的返回值,而在高8位(另一个寄存器)中留下了垃圾(或之前的斐波那契数)。在%#x
上打印以使其更明显(0xhilo
),而不是用无符号小数表示的256*hi + lo
。
C要求int
至少为16位,因此将返回类型声明为int
肯定会告诉编译器两个6502寄存器具有有意义的值。
如果函数仅在一个6502寄存器中返回8位整数,则将返回值声明为uint8_t
或unsigned char
。
否则,请修复您的asm以返回16位int
。 (检查编译器生成的asm,以了解调用约定使用了哪些寄存器。我个人并不知道6502,只是它具有8位寄存器。)