2015-11-30 112 views
1

我试图创建一个绘图程序,在当前光标位置显示一个块字符(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 

当程序运行用箭头在屏幕上光标的移动,但块字符没有出现,而且颜色不改变。任何人都可以解释为什么这个问题可能发生,以及我可能如何解决这个代码?

+0

软件设计提示:请查找表不同的密钥不同的结果映射,而不是也重复使用代码价值。检查扫描码是你正在寻找的扫描码之一,然后减去最低值(因此你的数组不是以一堆填充开始的)。请参阅http://stackoverflow.com/a/32356125/224132了解gcc如何优化出现在测试集合中某个值的'switch'上的地狱。如果扫描代码不够密集以使数组很好,那么您仍然可以分支设置值,并将int 10h insn(BIOS调用?)分解出来。 –

+0

我无法帮助您使用实际的控制台文字颜色的东西;我没有使用裸机或DOS代码。仅针对用户空间Linux中的性能进行优化。 –

回答

2

程序的顶部看起来是这样的:

org 100h 

kol db 12 
wiersz db 10 
kolor db 1111b 

kursor: 

其实你不声明这是数据,所以它实际上作为代码执行。为了将数据从代码中分离出来,并让代码先出现修改为:

org 100h 

; Declare .data section. Data section will be placed in COM program after code 
section .data 
kol db 12 
wiersz db 10 
kolor db 1111b 

; .TEXT section is the code section 
section .text 
kursor: 

在此代码:

kursor: 
mov ah,3  ; AH=3 read cursor? Maybe AH=2 for set cursor? 
mov bh,1 
mov dh,byte [wiersz] 
mov dl,byte [kol] 
int 10h 
mov bl,15  ; Not sure this does anything useful? 
int 10h  ; Not sure this does anything useful? 

我不知道你试图在做最后2行代码,所以我认为它们可以被删除。之前的行似乎试图将光标设置到屏幕上的初始位置。 AH = 2是设置光标所以我觉得代码应该是:

kursor: 
mov ah,2    ; AH=2 set cursor? 
mov bh,0    ; Should be page 0 (not 1) 
mov dh,byte [wiersz] ; Row 
mov dl,byte [kol] ; Column 
int 10h 

你有4行代码(一个用于上,下,左,右)看起来像这样:

mov bx,kolor 

这会将kolor变量的地址移动到BX。您想要移动字节值AT kolor。因此,线应该是这个样子的:

mov bl,[kolor] 

这将在内存位置KOLOR移动字节值到BL寄存器。 NASM假定您想要移动一个字节,因为BL是一个8位寄存器。

随着上述变化,你可能一直在寻找的代码是:

org 100h 

section .data 
kol db 12 
wiersz db 10 
kolor db 1111b 

section .text 
kursor: 
mov ah,2 
mov bh,0 
mov dh,byte [wiersz] 
mov dl,byte [kol] 
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 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 bl,[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 bl,[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 bl,[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 
+0

谢谢你的提示,我已经改变了我的其他代码基于它。最后,解决方案是方括号。它证明我缺乏这方面的知识。无论如何,再次感谢你。 – Milo

+1

看来您是Stackoverflow的新手。最近有几个人在[上一个问题]中帮助过你(http://stackoverflow.com/a/33962074/3857942)。如果有答案可以解决你的问题,那么你应该将它们标记为已解决,并且让人们回答。有关如何接受以及为什么,请参阅此SO信息:http://meta.stackexchange.com/a/5235/271768 –

+0

我非常感谢。一有空闲时间,我会尽快阅读。谢谢 – Milo