我正在尝试使用此功能通过访问C中的视频内存,在没有标准库的情况下将char *打印到屏幕:
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;
}
什么都没打印出来。
我做错了什么?
不同之处在于你在函数末尾增加了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;
}
}