[英]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位,并且您会将高8位(另一个寄存器)中的垃圾内容(或之前的斐波那契数)保留下来。 在%#x
处打印以使其更加明显( 0xhilo
),而不是使用无符号十进制获得的256*hi + lo
。
C要求int
至少为16位,因此将return类型声明为int
肯定会告诉编译器两个6502寄存器具有有意义的值。
如果函数仅在一个6502寄存器中返回8位整数,则将返回值声明为uint8_t
或unsigned char
。
否则,将您的asm修复为返回16位int
。 (检查编译器生成的asm,以了解调用约定使用了哪些寄存器。我个人并不知道6502,只是它具有8位寄存器。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.