我试图创建一个绘图程序,在当前光标位置显示一个块字符(ASCII 219)。向上,向下,向左和向右键用于在屏幕上导航。假设F1,F2,F3和F4改变颜色。退出键退出程序。使用功能键时,颜色不会像我所期望的那样变化。我的代码如下:更改控制台文本的颜色
org 100h
kol db 12
wiersz db 10
kolor db 1111b
kursor:
mov ah,3
mov bh,1
mov dh,byte [wiersz]
mov dl,byte [kol]
int 10h
mov bl,15
int 10h
petla:
; Get keystroke
mov ah,0
int 16h
; AH = BIOS scan code
cmp ah,48h
je gora
cmp ah,50h
je dol
cmp ah,4Bh
je lewo
cmp ah,4Dh
je prawo
cmp ah,3Bh
je F1
cmp ah,3Ch
je F2
cmp ah,3Dh
je F3
cmp ah,3Eh
je F4
cmp ah,3Fh
je F5
cmp ah,1
jne petla ; loop until Esc is pressed
mov ah,0x4c
int 0x21
gora:
sub byte [wiersz],1
mov ah,2
mov bh,0
mov dh,byte [wiersz]
mov dl,byte [kol]
int 10h
mov ah,09h
mov al,219
mov bx,kolor
mov cx, 1
int 10h
jmp petla
dol:
add byte [wiersz],1
mov ah,2
mov bh,0
mov dh,byte [wiersz]
mov dl,byte [kol]
int 10h
mov ah,09h
mov al,219
mov bx,kolor
mov cx, 1
int 10h
jmp petla
lewo:
sub byte [kol],1
mov ah,2
mov bh,0
mov dh,byte [wiersz]
mov dl,byte [kol]
int 10h
mov ah,09h
mov al,219
mov bx,kolor
mov cx, 1
int 10h
jmp petla
prawo:
add byte [kol],1
mov ah,2
mov bh,0
mov dh,byte [wiersz]
mov dl,byte [kol]
int 10h
mov ah,09h
mov al,219
mov bx,kolor
mov cx, 1
int 10h
jmp petla
F1:
mov byte [kolor], 0111b
int 21h
jmp petla
F2:
mov byte [kolor], 1001b
int 21h
jmp petla
F3:
mov byte [kolor], 0010b
int 21h
jmp petla
F4:
mov byte [kolor], 1011b
int 21h
jmp petla
F5:
mov byte [kolor], 1100b
int 21h
jmp petla
当程序运行用箭头在屏幕上光标的移动,但块字符没有出现,而且颜色不改变。任何人都可以解释为什么这个问题可能发生,以及我可能如何解决这个代码?
软件设计提示:请查找表不同的密钥不同的结果映射,而不是也重复使用代码价值。检查扫描码是你正在寻找的扫描码之一,然后减去最低值(因此你的数组不是以一堆填充开始的)。请参阅http://stackoverflow.com/a/32356125/224132了解gcc如何优化出现在测试集合中某个值的'switch'上的地狱。如果扫描代码不够密集以使数组很好,那么您仍然可以分支设置值,并将int 10h insn(BIOS调用?)分解出来。 –
我无法帮助您使用实际的控制台文字颜色的东西;我没有使用裸机或DOS代码。仅针对用户空间Linux中的性能进行优化。 –