我在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;
}
Run Code Online (Sandbox Code Playgroud)
其中fib()是6502程序集中的外部函数,它与C代码链接在一起.
我的6502代码:"fib.s"
fib:
//calculates fibonacci
Run Code Online (Sandbox Code Playgroud)
我用这两个文件编译 cl65 -t sim6502 main.c fib.s -o fib
你遗漏了代码fib.s.
很可能编译器期望一个16位的返回值,并且你将垃圾(或前一个Fibonacci数)留在高8位(另一个寄存器).打印%#x以使更明显的(0xhilo),而不是256*hi + lo你用无符号十进制得到的.
C要求int至少为16位,因此声明返回类型int肯定告诉编译器两个6502寄存器具有有意义的值.
声明返回值为uint8_t或者unsigned char如果您的函数仅在一个6502寄存器中返回8位整数.
否则修复你的asm返回16位int.(检查编译器生成的asm以了解调用约定使用哪些寄存器.我个人不知道6502,只是它有8位寄存器.)