Вопрос № 39169: Здравствуйте.
Помогите, пожалуйста, разобраться.
Вот прога из какого-то учебника по ассемблеру. Она должна переключать светодиоды на клаве. Компилируется нормально в формате .com, но не работает. Светодиоды не загораются хотя после её запуска...
Вопрос № 39.169
Здравствуйте.
Помогите, пожалуйста, разобраться.
Вот прога из какого-то учебника по ассемблеру. Она должна переключать светодиоды на клаве. Компилируется нормально в формате .com, но не работает. Светодиоды не загораются хотя после её запуска буквы печатаются большие а диод capslock не горит. Как сделать чтобы диоды загорались?
; mig.asm
; циклически переключает светодиоды клавиатуры
.model tiny
.code
org 100h
start proc near
mov ah,2 ; функция 02 прерывания 1Ah
int 1Ah ; получить текущее время
mov ch,dh ; сохранить текущую секунду в СН
mov cl,0100b ; CL = состояние светодиодов клавиатуры
main_loop:
call change_LEDs ; установить светодиоды в соответствии с CL
shl cl,1 ; следующий светодиод,
test cl,1000b ; если единица вышла в бит 3,
jz continue
mov cl,0001b ; вернуть ее в бит 0,
continue:
mov ah,1 ; проверить, не была ли нажата клавиша,
int 16h
jnz exit_loop ; если да - выйти из программы
push cx
mov ah,2 ; функция 02 прерывания 1Ah
int 1Ah ; получить текущее время
pop cx
cmp ch,dh ; сравнить текущую секунду в DH с СН,
mov ch,dh ; скопировать ее в любом случае,
je continue ; если это была та же самая секунда - не
; переключать светодиоды,
jmp short main_loop ; иначе - переключить светодиоды
exit_loop:
mov ah,0 ; выход из цикла - была нажата клавиша,
int 16h ; считать ее
ret ; и завершить программу
start endp
; процедура change_LEDs
; устанавливает состояние светодиодов клавиатуры в соответствии с числом в CL
change_LEDs proc near
call wait_KBin ; ожидание возможности посылки команды
mov al,0EDh
out 60h,al ; команда клавиатуры EDh
call wait_KBin ; ожидание возможности посылки команды
mov al,cl
out 60h,al ; новое состояние светодиодов
ret
change_LEDs endp
; процедура wait_KBin
; ожидание возможности ввода команды для клавиатуры
wait_KBin proc near
in al,64h ; прочитать слово состояния
test al,0010b ; бит 1 равен 1?
jnz wait_KBin ; если нет - ждать,
ret ; если да - выйти
wait_KBin endp
end start
Отправлен: 02.04.2006, 00:11
Вопрос задал: Rus (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Пан Павел Константинович
Здравствуйте, Rus!
По кодовому почерку видно, что этот код делал профи. и видемо он прежде чем отдовать её в использование тестировал. И она у него работала.
Мой вам совет, попробуйте запустить эту программу в "чистом ДОС" или создайте загрузочную дискету в Windows этим вы создадите ДОС, вот там то и попробуйте, ну предварительно загрузившись через загрузочную дискету.
С, Уважением MnEm0n!C.
--------- Hello Worlds
Ответ отправил: Пан Павел Константинович (статус: 5-ый класс)
Ответ отправлен: 02.04.2006, 09:45 Оценка за ответ: 5 Комментарий оценки: Пробовал из под нортона с ХР (дискеты не было) сегодня купил, загрузился - работает. Спасибо.