Вы не указали код для 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-битные регистры.)