2015-11-30 177 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