我一直致力于在我正在开发的操作系统中移动文本模式光标。我无法让它显示出来。这是我用来更新光标的代码:
void update_cursor()
{
unsigned char cursor_loc = (y_pos*Cols)+x_pos;
// cursor LOW port to vga INDEX register
outb(0x3D4, 0x0F);
outb(0x3D5, (unsigned char)(cursor_loc));
// cursor HIGH port to vga INDEX register
outb(0x3D4, 0x0E);
outb(0x3D5, (unsigned char)((cursor_loc>>8)));
}
static inline void outb(unsigned short port, unsigned char value)
{
asm volatile ( "outb %0, %1" : : "a"(value), "Nd"(port) );
}
static inline unsigned char inb(unsigned short port)
{
unsigned char ret;
asm volatile ( "inb %1, %0" : "=a"(ret) : "Nd"(port) );
return ret;
}
我使用gcc版本4.8.3(GCC)来编译我的主文件。我完全迷失了。任何人都有任何关于这可能是什么问题的建议? 如果您想查看完整的来源,请访问:https://github.com/AnonymousUser1337/Anmu/blob/master/Kernel/kernel.cpp
编辑:我正在使用虚拟框来运行它
提前致谢。
答案 0 :(得分:2)
您选择了错误的VGA寄存器。你必须使用0x0F作为低电平,使用0x0E作为高电平(两者都有0x0A)。
编辑:如果您的光标被禁用,这是启用它的方法:
void enable_cursor() {
outb(0x3D4, 0x0A);
char curstart = inb(0x3D5) & 0x1F; // get cursor scanline start
outb(0x3D4, 0x0A);
outb(0x3D5, curstart | 0x20); // set enable bit
}
同时检查this link是否有注册号和用法列表。
Edit2:您的光标位置变量不够宽,无法存储光标位置。 unsigned char cursor_loc
应为unsigned short cursor_loc
。
答案 1 :(得分:-1)
你的outb函数在错误的地方有端口和值。而不是:
asm volatile ( "outb %0, %1" : : "a"(value), "Nd"(port) );
尝试:
asm volatile ("outb %1, %0" : : "dN" (port), "a" (value));
希望有所帮助:)