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

时间:2018-09-03 04:12:52

标签: c assembly 6502

我已经在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

编译两个文件

1 个答案:

答案 0 :(得分:6)

您遗漏了fib.s的代码。

最有可能的是编译器期望一个16位的返回值,而在高8位(另一个寄存器)中留下了垃圾(或之前的斐波那契数)。在%#x上打印以使其更明显(0xhilo),而不是用无符号小数表示的256*hi + lo

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

如果函数仅在一个6502寄存器中返回8位整数,则将返回值声明为uint8_tunsigned char

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