5

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

clearScreen:
    pusha

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

    popa
    ret

我读了那个设置al为 0 并调用滚动屏幕中断会清理屏幕,但它似乎只会将第一行的颜色更改为灰色。

感谢任何可以解释为什么这不起作用的人。

4

1 回答 1

8

问题是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中断列表的此版本。

于 2014-04-09T20:49:21.983 回答