我在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_tunsigned char
否则,修复asm以返回16位int。(检查编译器生成的asm以了解调用约定使用了哪些寄存器。我个人不知道6502,只知道它有8位寄存器。)

关于c - 如何从C中的汇编代码打印整数值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52143062/

10-11 04:08