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

如何在C中打印汇编代码中的整数值,c,assembly,6502,C,Assembly,6502,我在6502汇编中编写了一个计算斐波那契数的函数。我在C中调用该函数,然后将这两个文件编译成6502的单个二进制文件。但是我得到的结果是不同的。10的斐波那契是55,但它输出2649。它计算0到10之间的数字的斐波那契,而不是整数的斐波那契。例如,0的斐波那契是257,1的斐波那契是258,10的斐波那契是2649,依此类推。为什么我会得到这样的输出 我的C代码:“main.C” 我使用cl65-tsim6502main.cfib.s-ofib编译了这两个文件,您遗漏了fib.s的代码 最有可能

我在6502汇编中编写了一个计算斐波那契数的函数。我在C中调用该函数,然后将这两个文件编译成6502的单个二进制文件。但是我得到的结果是不同的。10的斐波那契是55,但它输出2649。它计算0到10之间的数字的斐波那契,而不是整数的斐波那契。例如,0的斐波那契是257,1的斐波那契是258,10的斐波那契是2649,依此类推。为什么我会得到这样的输出

我的C代码:“main.C”


我使用
cl65-tsim6502main.cfib.s-ofib
编译了这两个文件,您遗漏了
fib.s
的代码

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

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

如果函数仅在一个6502寄存器中返回8位整数,则将返回值声明为
uint8\t
无符号字符


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

您遗漏了
fib.s
的代码

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

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

如果函数仅在一个6502寄存器中返回8位整数,则将返回值声明为
uint8\t
无符号字符


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

1。使用
extern
在C.2中标记外部定义的函数。也请发布汇编代码。3.尝试使用
uint8\u t
而不是
unsigned int
extern
对于函数声明是不必要的(但不会有任何影响)。为了MCVE的目的,您可以只发布返回42的汇编代码
fib()
似乎返回
int
,您将其分配给
无符号int
。虽然这里可能没问题(至少不是这样),但您可能应该使用相同的类型。如果6502是C=64,并且基本rom已启用,则有一个例程可以在$BDCD处写入整数。1.使用
extern
在C.2中标记外部定义的函数。也请发布汇编代码。3.尝试使用
uint8\u t
而不是
unsigned int
extern
对于函数声明是不必要的(但不会有任何影响)。为了MCVE的目的,您可以只发布返回42的汇编代码
fib()
似乎返回
int
,您将其分配给
无符号int
。虽然这里可能没问题(至少不是这样),但您可能应该使用相同的类型。如果6502是C=64,并且基本rom已启用,则有一个例程可以在$BDCD处写入整数@MilapJhumkhawala只需注意,使用uint8_t,您将无法计算超过前12个fibonacci数,因为第13个数字已不再适合8位…@MilapJhumkhawala只需注意,使用uint8_t,您将无法计算超过前12个fibonacci数,因为第13个数字已不再适合8位。。。
#include<stdio.h>

int fib();

int main() {
  unsigned int p = fib();
  printf("%u\n",p);
  return 0;
}
 fib:
    //calculates fibonacci