如何从 C 中的汇编代码打印整数值

How to print integer value from assembly code in C

我在 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 位 return 值,而您在高 8 位(另一个寄存器)中留下了垃圾(或之前的斐波那契数)。在 %#x 处打印以使其更明显 (0xhilo),而不是使用无符号十进制得到的 256*hi + lo

C 要求 int 至少为 16 位,因此将 return 类型声明为 int 肯定会告诉编译器两个 6502 寄存器具有有意义的值。

将 return 值声明为 uint8_tunsigned char 如果您的函数仅 return 在一个 6502 寄存器中是一个 8 位整数。

否则将您的 asm 修复为 return 16 位 int。 (查看编译器生成的 asm 以了解调用约定使用了哪些寄存器。我个人不知道 6502,只是它有 8 位寄存器。)