【问题标题】:Can't clear entire screen in 16-bit real mode Assembly在 16 位实模式汇编中无法清除整个屏幕
【发布时间】:2014-05-23 06:27:38
【问题描述】:

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

clearScreen:
    pusha

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

    popa
    ret

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

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

【问题讨论】:

    标签: assembly operating-system 16-bit real-mode


    【解决方案1】:

    问题是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 interrupt list 了解更多详情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-31
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      相关资源
      最近更新 更多