Наиболее вероятно, что, будучи старым 8-битным компилятором, он не преобразовывает char
типизированную i
переменную в int
, а просто нажимает регистр bc
(при условии, что ваша функция будет не используйте старшую часть, что просто неверно, поскольку ваша функция (printf()
) ожидает целиком int
в качестве параметра), который вы не знаете, что у нее есть в регистре b
. Компилятор использует полный регистр bc
для печати, так как вы используете формат %x
, который предназначен для параметра int
, и это объясняет присутствие старшего байта как 0x0a
в выводе (и что не нигде в вашем листинге ассемблера). Более поздние версии стандарта начали преобразовывать все аргументы short
и char
в int
, чтобы, вероятно, избежать такого рода проблем.
Попробуйте этот код и посмотрите, решит ли он проблему.
#include<stdio.h>
main()
{
char i = 0;
do
{
printf("0x%04x | ", (int) i);
} while (++ i);
}
(здесь проверить не могу, так как у меня компьютер z80, но не C компилятор для него)
Edit
После проверки кода ассемблера вывод компилятора просто помещает в стек полный регистр bc
, в котором нижняя часть (регистр c
) происходит от символа, который вы хотите напечатать, но регистр b
был ранее загружен старшим байтом 59999
указатель на массив символов строки формата, который оказывается 0xea
. Итак, я застрял на выходе, который, вероятно, должен быть 0xea00, 0xea01, 0xea02, ...
, а не тот, который у вас есть. Вы перекомпилировали исходный код, чтобы получить вывод ассемблера, и вывод относится к другой компиляции?
Чтобы копнуть еще немного, мне понадобится код функции printf()
, которую, как я полагаю, у вас нет иметь. Но похоже, что преобразование параметра в (int)
перед передачей его функции printf()
должно решить проблему.