文本模式光标在设置视频模式或清除屏幕后消失



我在x86汇编中编写一个内核,应该显示一条欢迎消息,等待键按键,清除屏幕并从键盘打印输入。到目前为止,这一切都在工作,直到清除屏幕为止。具体而言,清除屏幕后,将删除光标。

首先,我尝试使用此代码清除屏幕:

mov ah, 0x06
mov al, 0x00
mov cx, 0x00
mov dh, 0x19
mov dl, 0x50
int 0x10

这确实清除了屏幕,但是,光标不再显示,并且不显示键盘输入。我尝试重新设置视频模式:

mov ah, 0x00
mov al, 0x03
int 0x10

这也清除了屏幕,并且显示了键盘输入,但是光标仍然隐藏。我尝试使用此代码显示:

mov ah, 0x01
mov ch, 0x06
int 0x10

它仍然不会显示光标。我将如何显示光标或清除屏幕以使其仍在显示?

更新:我的代码:

kernel_main:
    mov ax, 0x07C0
    add ax, 288
    mov ss, ax
    mov sp, 4096
    mov ax, 0x07C0
    mov ds, ax
    mov si, kern_inst
    call print_str
    call pause_key
    call clear_screen
    call function
    mov si, kern_fin
    call print_str
.data:
    kern_inst db "Tap any key to begin the program.", 0
    kern_fin db "The program successfully finished.", 0
function:
    call solid_cursor
    call print_input
    call hide_cursor
    call print_input
    ret
print_str:
    pusha
    mov ah, 0x0E
.repeat:
    lodsb
    cmp al, 0
    je .ret
    int 0x10
    jmp .repeat
.ret:
    popa
    ret
print_input:
    pusha
.repeat:
    mov ah, 0x00
    int 0x16
    cmp al, 0x0D
    je .ret
    mov ah, 0x0E
    int 0x10
    jmp .repeat
.ret:
    popa
    ret
clear_screen:
    pusha
    mov ah, 0x06
    mov al, 0x00
    mov bh, 0x07
    mov cx, 0x00
    mov dh, 0x19
    mov dl, 0x50
    int 0x10
    mov ah, 0x02
    mov bh, 0x00
    mov dx, 0x00
    int 0x10
    popa
    ret
solid_cursor:
    pusha
    mov ah, 0x01
    mov ch, 0x06
    int 0x10
    popa
    ret
hide_cursor:
    pusha
    mov ah, 0x01
    mov ch, 0x26
    int 0x10
    popa
    ret
pause_key:
    push ax
    mov ah, 0x00
    int 0x16
    pop ax
    ret

我发现删除solid_cursor程序将使光标可见。但是,当我故意使用hide_cursor使光标不可见时,我就无法恢复可见光标。

您不需要BIOS即可清除屏幕。只需在b800:0的视频缓冲区上写入零即可。快得多:

xor di, di
mov bx, 0b800h
mov es, bx
mov cx, 2000
mov ax, 0720h ; black background 0 / grey foreground 7 / space character (0x20)
rep stosw

相关内容

  • 没有找到相关文章