我在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
编译这两个文件 最佳答案
你漏掉了fib.s
的代码。
编译器很可能需要16位的返回值,而您将垃圾(或上一个Fibonacci数)留在8位(另一个寄存器)中。在%#x
处打印以使其更明显(0xhilo
),而不是使用无符号小数得到的256*hi + lo
。
C要求int
至少为16位,因此将返回类型声明为int
肯定会告诉编译器两个6502寄存器具有有意义的值。
如果函数在6502寄存器中只返回8位整数,则将返回值声明为uint8_t
或unsigned char
。
否则,修复asm以返回16位int
。(检查编译器生成的asm以了解调用约定使用了哪些寄存器。我个人不知道6502,只知道它有8位寄存器。)
关于c - 如何从C中的汇编代码打印整数值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52143062/