设置视频模式或清屏后文本模式光标消失
Text Mode Cursor Disappearing after Setting Video Mode or Clearing Screen
我正在用 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
我正在用 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