无法在16位实模式汇编中清除整个屏幕

5
我正在尝试在我的简单16位实模式操作系统中清除屏幕。以下是代码:


我正在尝试在我的简单16位实模式操作系统中清除屏幕。以下是代码:

clearScreen:
    pusha

    mov ah, 0x7
    mov al, 0
    int 0x10

    popa
    ret

我读到过将al设置为0并调用滚动屏幕中断会清除屏幕,但似乎只会将第一行的颜色更改为灰色。感谢任何能解释为什么这不起作用的人。
1个回答

9
问题在于int 0x10函数0x07所需的参数比你提供的要多。具体来说,
  • AH = 07 = 向下滚动窗口
  • AL = 要滚动的行数(或全部为0)
  • BH = 写入空行的属性
  • CH,CL = 窗口左上角的行和列
  • DH,DL = 窗口右下角的行和列

除非你设置它们,否则它们将只包含之前指令中存在的内容,这很可能不是你想要的!

因此,假设你正在使用标准的80x25字符屏幕,你的代码应该像这样编写:

clearScreen:
    pusha

    mov ax, 0x0700  ; function 07, AL=0 means scroll whole window
    mov bh, 0x07    ; character attribute = white on black
    mov cx, 0x0000  ; row = 0, col = 0
    mov dx, 0x184f  ; row = 24 (0x18), col = 79 (0x4f)
    int 0x10        ; call BIOS video interrupt

    popa
    ret

要了解更多详情,请查看著名的Ralf Brown中断列表的这个版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接