我试图实现一个VGA打印功能,但我不能得到数据被视为一个非空字符。即使我在这个函数中硬编码数据,它仍然会跳过while
循环。我有一个调试打印,如果计数为零,它将打印Z
,并且它总是打印它,光标不移动,所以我很有信心它没有进入while
循环
void vga_print(char *data, char mode) {
char *vga = (char *)(VGA_MEM_LOC);
uint8_t count = 0;
while (*data != '\0') {
if (*data == '\n') {
current_x = 0;
current_y++;
} else {
*vga++ = *data++;
*vga++ = mode;
current_x++;
if (current_x >= screen_x) {
current_x = 0;
current_y++;
}
}
count++;
}
// move the cursor
uint16_t location = current_x + ((current_y) * screen_x);
x86_port_out(VGA_CRT_INDEX, VGA_CURSOR_LOW);
x86_port_out(VGA_CRT_DATA, location);
x86_port_out(VGA_CRT_INDEX, VGA_CURSOR_HIGH);
x86_port_out(VGA_CRT_DATA, location >> 8);
}
编辑:如果我将数据字符串初始化为char example[] = "xyz\0"
而不是char *example = "xyz\0"
,则可以工作
1条答案
按热度按时间x6yk4ghg1#
函数中存在问题,但没有一个可以解释观察到的行为。可能是全局变量
current_x
、current_y
和screen_x
的初始值有问题,或者是你从没有发布的代码中调用函数的方式有问题。VGA_CRT_INDEX
、VGA_CURSOR_LOW
、VGA_CRT_DATA
、VGA_CURSOR_HIGH
、VGA_MEM_LOC
和函数x86_port_out
的定义也可能不正确。以下是一些问题:
current_x
和current_y
会为每个字节和换行符进行更新,但vga
指针不会移动,因此下一个字符会粘在上一个输出上。*data == '\n'
:这将导致无限循环。current_y >= screen_y
的情况。以下是修改后的版本: