Assembly 设置视频模式或清除屏幕后文本模式光标消失
我正在用x86汇编编写一个内核,它应该显示欢迎消息,等待按键,清除屏幕,并从键盘打印输入。到目前为止,这一切都在工作,直到屏幕被清除。具体来说,清除屏幕后,光标将被移除 首先,我尝试使用此代码清除屏幕:Assembly 设置视频模式或清除屏幕后文本模式光标消失,assembly,x86-16,bios,Assembly,X86 16,Bios,我正在用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
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\u游标
过程会使游标可见;但是,当我故意使用“隐藏光标”使光标不可见时,我无法恢复为可见光标。您不需要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
我试过了,但光标仍然无法显示。此外,我不能在这之后显示字符。至于在滚动后看不到字符。由于屏幕被有效地清除为黑对黑-之后打印的字符被显示,但您就是看不到它们;-)。EGA 16调色板可以在这里找到:我决定再次访问它,并注意到当您滚动以清除屏幕时,您从未设置BH,它可能包含0。BH是滚动用于清除一行的屏幕属性,很可能设置为黑色对黑色的值(高4位为背景色,低4位为前景色)。屏幕最初使用0x07(黑白相间)。在滚动之前,我要说的是使用
mov-BH,0x07
设置BH。光标使用当前的前景色和背景色闪烁。Black on Black将尝试在Black上显示一个闪烁的黑色光标,当然它看起来没有任何作用。我想您的意思是使用mov bh,0x07
。我这样做了,字符确实出现了,但是,光标仍然是隐藏的。特别是在那些函数中,我看不到你是什么意思0b800h@MichaelPetch哦,你说得对。已经有一段时间了!:)