Как вывести целочисленное значение из ассемблерного кода в C - PullRequest
0 голосов
/ 03 сентября 2018

Я написал функцию в сборке 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 голосов
/ 03 сентября 2018

Вы не указали код для fib.s.

Скорее всего, компилятор ожидает 16-битное возвращаемое значение, и вы оставляете мусор (или предыдущее число Фибоначчи) в старших 8 битах (другой регистр). Напечатайте на %#x, чтобы сделать это более очевидным (0xhilo) вместо 256*hi + lo, которое вы получаете с десятичным знаком без знака.

C требует, чтобы int было не менее 16 бит, поэтому объявление типа возврата как int определенно говорит компилятору, что два регистра 6502 имеют значимые значения.

Объявите возвращаемое значение как uint8_t или unsigned char, если ваша функция возвращает только 8-разрядное целое число в одном регистре 6502.

В противном случае исправьте asm, чтобы он возвращал 16-битный int. (Проверьте сгенерированный компилятором asm, чтобы узнать, какие регистры используются соглашением о вызовах. Лично я не знаю 6502, просто он имеет 8-битные регистры.)

...