assembly - 如何通过 x86 BIOS 调用移动光标?

标签 assembly nasm x86-16 bootloader bios

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

为了让事情变得更困惑,在书中,它提到在引发中断 10h 之前我需要设置的寄存器是用于 Y 坐标的 bh 和用于X 坐标。维基百科提到 bh 表示页码,dhdl 表示行和列。这些方法对我来说都不起作用。

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

MovCursor:
    pusha

    mov ah, 0x02

    mov bh, 0x1
    mov bl, 0x4

    int 0x10

    popa

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

最佳答案

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

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

  • 在图形屏幕上,光标永远不会呈现。坐标发生变化,但它保持不可见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?

关于assembly - 如何通过 x86 BIOS 调用移动光标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69785228/

相关文章:

assembly - 汇编器 8086 将 32 位数除以 16 位数

c - About Variable-Size Stack Frames,关于栈帧的对齐,来自CSAPP的一个例子

assembly - 编译汇编代码

assembly - NASM - 错误 : label or instruction expected at start of line

linux - 组装 NASM - AND 掩模

linux - 当我在 system_read 中断、程序集方面按下 Enter 按钮时究竟发生了什么?

c - ARM GCC 生成的函数序言

linux - NASM Linux 32 位 : scanf, printf 调用

linux - 在适用于 Linux 的 Windows 子系统上的 Ubuntu 上使用 INT 0x80 汇编编译的可执行文件不产生输出

assembly - 我如何编写一个在 NASM 16 位实模式下打印空终止字符串的函数?