如何从 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_t
或 unsigned char
如果您的函数仅 return 在一个 6502 寄存器中是一个 8 位整数。
否则将您的 asm 修复为 return 16 位 int
。 (查看编译器生成的 asm 以了解调用约定使用了哪些寄存器。我个人不知道 6502,只是它有 8 位寄存器。)
我在 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_t
或 unsigned char
如果您的函数仅 return 在一个 6502 寄存器中是一个 8 位整数。
否则将您的 asm 修复为 return 16 位 int
。 (查看编译器生成的 asm 以了解调用约定使用了哪些寄存器。我个人不知道 6502,只是它有 8 位寄存器。)