глобальная переменная не работает, когда та же переменная работает, когда объявлена ​​в функции - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь распечатать символ * на экране без стандартной библиотеки, получая доступ к видеопамяти в C с помощью этой функции:

int printchar(char c) {
        int videohex = 0xb8000;
        char* vidmem = (char*) videohex;
        *vidmem = c;
        videohex = videohex + 2;
}

Код выводит переменную c на экран, как и ожидалось, но когда я объявляю videohex как глобальную переменную (я буду использовать эту переменную во всей программе), используя этот код:

int videohex = 0xb8000;

int printchar(char c) {
        char* vidmem = (char*) videohex;
        *vidmem = c;
        videohex = videohex + 2;
}

Ничего не распечатано.

Что я делаю неправильно?

1 Ответ

0 голосов
/ 05 апреля 2019

Разница в том, что вы увеличиваете 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...