2015-11-30 7 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» insns (вызовы 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] 

Это переместит значение байта в ячейке памяти Колор в 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

 Смежные вопросы

  • Нет связанных вопросов^_^