如何使用 x86 BIOS 调用移动光标?

Posted

技术标签:

【中文标题】如何使用 x86 BIOS 调用移动光标?【英文标题】:How to move the cursor with x86 BIOS calls? 【发布时间】:2021-12-15 11:51:11 【问题描述】:

我正在编写《操作系统从 0 到 1》一书中的一些操作系统教程。其中一项练习是将光标设置到引导加载程序中屏幕上的某个位置。但是,无论我尝试什么,光标都只停留在左上角的相同位置。

为了让事情更混乱,书中提到我需要在引发中断 10h 之前设置的寄存器是 Y 坐标的 bh 和 X 坐标的 bl。***提到 bh 表示页码,dhdl 表示行和列。这两种方法都不适合我。

这是我正在使用的函数(使用 book 方法):

MovCursor:
    pusha

    mov ah, 0x02

    mov bh, 0x1
    mov bl, 0x4

    int 0x10

    popa

任何帮助告诉我我做错了什么将不胜感激。

【问题讨论】:

请参阅this reference 以了解要使用的正确寄存器。这本书很可能是错的。 【参考方案1】:

***的注册设置是正确的。从您所说的“这些方法都不适合我”,我得出结论,您也尝试过***版本。很遗憾我无法验证您的代码,因为您没有将其包含在您的问题中。

关于光标需要考虑的几点:

在图形屏幕上,光标永远不会呈现。坐标发生了变化,但它保持不可见1。在文本屏幕上,光标默认为闪烁的下划线。 光标的坐标(列和行)从零开始。屏幕的左上角位于 (0,0)。 如果您将光标移出屏幕,光标将消失。 您可以使用 Bios.SetCursorType 函数 01h 更改光标的形状。你也可以这样让它消失!

接下来的代码在屏幕中间显示一串彩色的 A:

mov  ax, 0003h    ; BIOS.SetVideoMode 80x25 16-color text
int  10h

mov  dx, 0C23h    ; DH is Row (12), DL is Column (35)
mov  bh, 0        ; DisplayPage
mov  ah, 02h      ; BIOS.SetCursorPosition
int  10h

mov  cx, 10       ; ReplicationCount
mov  bx, 002Fh    ; BH is DisplayPage (0) , BL is Attribute (BrightWhiteOnGreen)
mov  ax, 0941h    ; BIOS.WriteCharacterAndAttribute, AL is ASCII ("A")
int  10h

mov  ah, 00h      ; BIOS.WaitKeyboardKey
int  16h          ; -> AX

1对于一些轻阅读How can I add a blinking cursor to the graphics video modes?

【讨论】:

以上是关于如何使用 x86 BIOS 调用移动光标?的主要内容,如果未能解决你的问题,请参考以下文章

如何在计算机的Bios菜单中启用磁盘控制器

redolbook14e如何设置bios

内核如何获取内存

双系统如何用BIOS设置开机启动优先级?

Vim中如何移动光标

如何使用 BIOS 中断设置引导分区