移动文本模式光标不起作用

时间:2014-08-15 05:22:40

标签: c++ assembly osdev

我一直致力于在我正在开发的操作系统中移动文本模式光标。我无法让它显示出来。这是我用来更新光标的代码:

   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

编辑:我正在使用虚拟框来运行它

提前致谢。

2 个答案:

答案 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));

希望有所帮助:)