【问题标题】:Moving text mode cursor not working移动文本模式光标不起作用
【发布时间】:2014-08-15 05:22:39
【问题描述】:

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

   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

编辑:我正在使用 Virtual box 来运行它

提前致谢。

【问题讨论】:

    标签: c++ assembly osdev


    【解决方案1】:

    您选择了错误的 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

    【讨论】:

    • 我试过了仍然没有运气光标甚至没有出现我编辑了我的代码以匹配你的建议
    • @AnonymousUser 在调用 update_cursor 之前光标是否可见?
    • 我认为更新光标应该让它可见,但它不是
    • @AnonymousUser 更新了答案。
    • 仍然无法正常工作我在程序开始时启用光标,然后每次打印什么都没有更新。我打印了 curstart,如果有帮助,它会显示为 14
    【解决方案2】:

    你的 outb 函数在错误的地方有端口和值。而不是:

    asm volatile ( "outb %0, %1" : : "a"(value), "Nd"(port) );
    

    试试:

    asm volatile ("outb %1, %0" : : "dN" (port), "a" (value));
    

    希望对你有帮助:)

    【讨论】:

    • 查看他的 Makefile,他正在使用 AT&T 语法的内联汇编的默认 GCsettings。使用 AT&T 语法,它是源,目标,因此他们正确使用 outb 和 AT&T 语法。如果他们使用-masm=intel 编译,那么这将是一个问题。
    猜你喜欢
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    相关资源
    最近更新 更多