Разница в том, что вы увеличиваете videohex
в конце функции.
Когда это локальная переменная, каждый раз, когда вы вызываете функцию, она повторно инициализируется до 0xb8000
.
Когда это глобальная переменная, она сохраняет обновленное значение между вызовами.При следующем вызове функции она будет записывать в другое место в памяти.В конце концов вы увеличите его до конца видеопамяти.
Вероятно, вам следует использовать две переменные.Один указывает на основание видеопамяти, другой - смещение для текущего символа.Вы можете увеличить смещение, и когда вы достигнете конца, оно может обернуться обратно к 0
.
Нет необходимости в переменных int
и char *
, вы можете просто инициализировать указатель по мере необходимости.хочу:
const char *video_base = (char *)0xb8000;
unsigned int video_offset = 0;
#define VIDEO_MAX 0x1000
int printchar (char c) {
video_base[video_offset] = c;
video_offset += 2;
if (video_offset >= VIDEO_MAX) {
video_offset = 0;
}
}