Консультация № 191781
15.11.2017, 16:36
0.00 руб.
0 15 1
Уважаемые эксперты, здравствуйте,

прошу помощи в следующем вопросе:
написал код который должен выводить скан-коды клавиш (пока только для нажатия), но почему-то код не работает - при нажатии клавиш скан-коды не выводятся на экран. процедура работает правильно - я проверил ее как отдельную программу - выводит содержимое регистра AL на экран в HEX-формате. прошу вас подсказать мне, где моя ошибка и как ее можно исправить мою ошибку.

Спасибо.

Код:
model tiny
code1 segment
assume cs:code1,ds:code1,ss:code1,es:code1
org 100h

begin:

mov ax,3
int 10h

mov ax,3509h
int 21h

mov old09o,bx
mov old09s,es
mov ax,2509h
mov dx,offset new09
int 21h

mov ah,9
mov dx,offset mess1
int 21h

mov ah,10
mov dx,offset mess2
int 21h

mov ax,2509h
mov dx,old09o
mov ds,old09s
int 21h

ret

old09o dw ?
old09s dw ?

mess1 db 10,10,13,'Enter a key: $'
mess2 db 120,?,120 dup(?)

new09:

in al,60h
and al,01111111b

push ax

call proc1

proc1 proc
pop ax

mov bx,1030h
mov ah,0
div bh ; ax/bh=(al, ost->ah)

cmp ah,09h
ja @@03

add bl,ah
jmp @@04

@@03:
mov bl,41h
sub ah,0Ah
add bl,ah

@@04:
mov ah,0
div bh ; ax/bh=(al, ost->ah)

cmp ah,09h
ja @@05

mov dx,3030h
add dx,ax
jmp @@06

@@05:
mov dx,4141h
sub ah,0Ah
add dx,ax

@@06:

push dx

mov ah,2
mov dh,10
mov dl,20
mov bh,0
int 10h

pop dx

mov ah,2
mov dl,dh
int 21h

mov dl,bl
int 21h

mov dl,68h
int 21h

; mov dl,0Dh
; int 21h

ret

proc1 endp

code1 ends
end begin

Обсуждение

давно
Посетитель
401339
51
15.11.2017, 16:38
общий
Уважаемые эксперты,
добрый вечер,

пример кода, который выводит содержимое регистра AL на экран в HEX-формате, показан ниже.


Код:
model tiny
.code
org 100h

start:
mov al,0F5h
;начало вывода

mov bx,1030h
mov ah,0
div bh ; ax/bh=(al, ost->ah)

cmp ah,09h
ja @@03

add bl,ah
jmp @@04

@@03:
mov bl,41h
sub ah,0Ah
add bl,ah

@@04:
mov ah,0
div bh ; ax/bh=(al, ost->ah)

cmp ah,09h
ja @@05

mov dx,3030h
add dx,ax
jmp @@06

@@05:
mov dx,4141h
sub ah,0Ah
add dx,ax

@@06:
mov ah,2
mov dl,dh
int 21h

mov dl,bl
int 21h

;конец вывода
; mov ah,0
; int 16h

mov ah,4Ch
int 21h

end start

давно
Посетитель
7438
7205
15.11.2017, 16:53
общий
15.11.2017, 17:13
Адресаты:
Предлагаю вот такую подпрограммку вывода содержимого регистра AL на экран в HEX-формате
[code lang=asm] model tiny
.code
org 100h
start:
mov al,0F5h
call PrBHex
;конец вывода
mov ah,0
int 16h
mov ah,4Ch
int 21h

PrBHex: push ax
shr al, 4
call PrHDig
pop ax
and al,0fh
PrHDig: add al, 90h
daa
adc al, 040h
daa
mov ah, 0eh
int 10h
ret

end start
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
15.11.2017, 17:10
общий
Адресаты:
Обязательно выводить из прерывания клавиатуры?
Гораздо проще вывести код, полученный при помощи int 16h
[code lang=asm]model tiny
code1 segment
assume cs:code1,ds:code1,ss:code1,es:code1
org 100h
begin:
mov ax,3
int 10h

mov ah,9
mov dx,offset mess1
int 21h

wait_loop:
mov ah, 0
int 16h
cmp ah, 1 ;ESC
je exit
mov al, ah
call PrBHex
mov al, ' '
int 10h
jmp wait_loop

exit:
ret

mess1 db 10,10,13,'Enter a key: $'

PrBHex: push ax
shr al, 4
call PrHDig
pop ax
and al,0fh
PrHDig: add al, 90h
daa
adc al, 040h
daa
mov ah, 0eh
int 10h
ret

code1 ends
end begin[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401339
51
15.11.2017, 17:25
общий
Адресаты:
Уважаемый Игорь Витальевич,
здравствуйте,

1) спасибо за Ваше сообщение и Ваш код-подпрограмму. . с новыми командами разберусь с помощью Интернета. у меня есть дополнительные вопросы, с которыми я не встречался в Интернете до сих пор.

2) Вы используете PrBHex и PrHDig - что это такое ? почему они не обозначены как процедуры, то есть например

PrBHex proc
...
ret
PrBhex endp

3) где конец процедуры PrBHex ?

4) правильно ли я понимаю, что одна процедура может быть частью кода другой процедуры, то есть не обязательно через call ? то есть процедура PrHDig фактически есть продолжение процедуры PrBhex после строки 17 ?
это уже что-то новое - ни в Си, ни в Фортране я не встречал такой архитектуры программирования.

5) правильно ли я понимаю, что строка 15, call PrHDig, фактически вызывает строки 18-25 ? а с какими параметрами ? правильно ли я понимаю, что параметр для вызова процедуры call PrHDig находится в регистре AL строка 14 ?

Спасибо.
давно
Посетитель
7438
7205
15.11.2017, 17:32
общий
Вот с выводом из прерывания Показывает и нажатие, и отпускание
Ответить на вопросы пока не смогу, занят. Если не получится разобраться, отвечу позже, может, завтра...
В Ассемблере возможно все...
[code lang=asm]code1 segment
assume cs:code1,ds:code1,ss:code1,es:code1
org 100h
begin:
mov ax,3
int 10h

mov ax,3509h
int 21h

mov old09o,bx
mov old09s,es
mov ax,2509h
mov dx,offset new09
int 21h

mov ah,9
mov dx,offset mess1
int 21h

wait_loop:
mov ah,0
int 16h
cmp ah,1
jne wait_loop

exit:
mov ax,2509h
mov dx,old09o
mov ds,old09s
int 21h

ret

old09o dw ?
old09s dw ?

mess1 db 10,10,13,'Enter a key: $'

new09:
push ax
in al,60h
push ax
in al,61h
mov ah,al
or al,80h
out 61h,al
xchg ah,al
out 61h,al
pop ax
call PrBHex
mov al, ' '
int 10h
pop ax
jmp dword ptr cs:[old09o]

PrBHex: push ax
shr al, 4
call PrHDig
pop ax
and al,0fh
PrHDig: add al, 90h
daa
adc al, 040h
daa
mov ah, 0eh
int 10h
ret

code1 ends
end begin[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
15.11.2017, 17:50
общий
это ответ
Здравствуйте, ialmiev!

Правильный вариант Вашего кода:
[code lang=asm]model tiny
.code
org 100h
begin: mov ah,11h
int 16h
jnz begin
mov ah,10h
int 16h
cmp ah,1
jz OB02
mov al,ah
aam 16
xchg al,ah
call outByte
xchg al,ah
call outbyte
mov al,' '
int 29h
jmp begin
outByte:cmp al,10
jb OB01
add al,7
OB01: add al,'0'
int 29h
OB02: ret
end begin[/code]
Удачи!
5
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
15.11.2017, 18:25
общий
Адресаты:
[code lang=asm]PrBHex proc
...
ret
PrBhex endp[/code]
Это логические директивы компилятору, они определяют подпрограмму как единое целое и с другого участка кода нельзя будет перейти в средину кода подпрограммы.

Ваши ошибки:
1)аппаратный обработчик клавиатуры выполняет ещё много различных функций важных для ОСи и если Вы их не сделаете, то система может рухнуть. Он должен сбросить контролер клавиатуры-т.е. сказать ему, что событие обработано, также должен ещё быть сброшен контролер обработки аппаратных прерываний, чтобы другие аппаратные прерывания могли дождаться своей очереди;

2)
[code lang=asm] push ax
call proc1
proc1 proc
pop ax[/code]
Тут Вы пытаетесь получить, что? Если Вы думаете, что там будет код нажатой клавиши, то поверьте нет.
Этот прием называется лямда-смещение кода, который позволяет программе получить адрес расположение кода в памяти. Там будет адрес возврата, т.е. адрес команды РОР АХ;

3)
Использование программных прерываний внутри аппаратных - запрещено, т.к. у них более низкий приоритет. Для имитатора, это может пройти, но на реальном железе будет ступор системы.

Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
15.11.2017, 18:27
общий
Добавлю к п.3:
Можно использовать программный вызов PUSHF | CALL, но не INT.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
401339
51
15.11.2017, 19:13
общий
15.11.2017, 19:15
Адресаты:
Уважаемые Константин Николаевич и Игорь Витальевич,
добрый вечер,

1) спасибо большое за Ваши коды-программы. сначала попытаюсь разобраться в них самостоятельно. если будут (наверное возникнут) вопросы, то для обсуждения конечно же задам их на мини-форуме.

2)
Код:
 ... аппаратный обработчик клавиатуры выполняет ещё много различных функций важных для ОСи и если Вы их не сделаете, то система может рухнуть. Он должен сбросить контролер клавиатуры-т.е. сказать ему, что событие обработано, также должен ещё быть сброшен контролер обработки аппаратных прерываний, чтобы другие аппаратные прерывания могли дождаться своей очереди;...

Константин Николаевич, Вы говорите с точки зрения электроники ... что (какие темы по электронике) для понимания Вас мне необходимо будет изучить в будущем - микроконтроллеры ? их строение и функции ? их программирование ? ... ?

3) Константин Николаевич, есть ли в Интернете доступные ресурсы объясняющие функционирование программируемой микросхемы Intel 8255 ? для которой и относятся команды in 60h, in 61h.
является ли данная микросхема - микроконтроллером клавиатуры, то есть микрокомпьютером отвечающим за функционирование клавиатуры (и динамика звука и т.д.) ?

4)
Код:
Он должен сбросить контролер клавиатуры-т.е. сказать ему, что событие обработано, также должен ещё быть сброшен контролер обработки аппаратных прерываний,

это для меня становится интересным .
правильно ли я понимаю, что а) микроконтроллер(ы) программируется Ассемблером и Си и б) затем его состоянием (напряжением на определенных ножках-ручках и его внутренностях) можно регулировать еще дополнительно, то есть, как-бы сказать, перепрограммировать в режиме реального времени ?

Константин Николаевич, я приношу свои извинения не свою некомпетентность по микроконтроллерам - если Вы не против, то не могли бы мы оставить данную тему (микроконтроллеры) немного на позже, чтобы сначала закрепить и выучить хорошенько команды Ассемблера - к сожалению мы с Вами не Роботы Вертеры из "Гостьи из будущего", чтобы подсоединиться к Интернету и быстро-быстро выучить Ассемблер и электронику-схемотехнику.

Еще раз спасибо за Вашу помощь по Ассемблеру.
давно
Старший Модератор
31795
6196
15.11.2017, 19:49
общий
Адресаты:
Почитайте Зубков С. Assembler для DOS, Windows и UNIX(стр.245).

А вообще начинайте обзаводится книгами:
Абель П Ассемблер и Программирование Для Ibm Pc
Абель П Ассемблер и Программирование Для Ibm Pc.txt
Аблязов Р. Программирование на ассемблере на платформе х86-64
Бондарев В.М.Основы программирования
Бурдаев О.В. Иванов М.А. Тетерин И.И. Ассемблер в задачах защиты информации
Витницкий В.Я. Архитектура IBM PC и язык Ассемблера
Вострикова З. Программирование на языке Ассемблера ЕС ЭВМ
Голубь Н. Искусство программирования на Ассемблере
Данкан Р. Профессиональная работа в MS-DOS
Дробушевич Г.А. Справочник программиста
Зубков С. Assembler для DOS, Windows и UNIX
Ирвин К. Язык ассемблера для процессоров Intel
Калашников О. Ассемблер. Это просто
Калашников О.А. Ассемблер - это просто. Учимся программировать (2-е издание, 2011)
Ключи tasm и tlink
Козиол Д., Личфилд Д. Искусство взлома и защиты систем
Крупник А. Ассемблер Самоучитель
Крупник А.Б. Изучаем Ассемблер
Кулаков В. - Программирование на аппаратном уровне_ специальный справочник.
Кулаков В. Программирование дисковых подсистем
Кучеренко В. Ассемблер. Тонкости, хитрости и секреты программирования
Лин В. PDP-11 и VAX-11 Архитектура ЭВМ и программирование на языке ассемблера
Магда Ю. - Ассемблер для процессоров Intel Pentium
Малютин Э.А., Шитов Ю.И. Английский язык для программистов
Марек Р. Ассемблер на примерах. Базовый курс
Морер У. - Язык ассемблера для персонального компьютера Эпл
Мытницкий В. Архитектура IBM PC и язык Ассемблера
Несвижский В. Программирование аппаратных средств в Windows
Нортон П. Персональн компьютер фирмы IBM операционн система MS-DOS 600
Нортон П. Программно-аппаратная организация IBM PC
Нортон П. Работа с жестким диском IBM PC
Нортон П. Соухэ Д. Язык ассемблера для IBM PC
Одиноков В.В. Программирование на ассемблере
Петцольд Ч. Код. Тайный язык информатики
Пильщиков В. Программирование на языке ассемблер IBM PC
Пирогов В. Ассемблер для Windows
Пирогов В. Ассемблер и дизассемблирование
Пирогов В. Ассемблер Учебный курс
Рудаков П.И., Финогенов К.Г. Программируем на языке ассемблера IBM PC (1997)
Салихан Д. BIOS. Дизассемблирование, модификация, программирование
Северов Л.С. Архитектура ЭВМ и язык ассемблера
Сингер М. Мини-ЭВМ РDР-11 - Программирование на языке ассемблера и организация машины
Скляров И. Изучаем Assembler за 7 дней (2010)
Скэнлон Л.Дж. Персональные ЭВМ IBM PC и XT. Программирование на языке ассемблера
Соколенко П. Программирование SVGA-графики для IBM PC
Спесивцев А.В. Вегнер В.А. Крутяков А.Ю. Серегин В.В Сидоров В.А. Защита информации в персональных ЭВМ
Столяров А.В. Программирование на языке ассемблера NASM для ОС UNIX
Титовский С.В. Языки программирования. Ассемблер
Финогенов К. Самоучитель по системным функциям МС-ДОС
Хоггер К. Введение в логическое программирование
Хогланд Г. МакГроу Г. Взлом программного обеспечения анализ и использование кода
Элфринг Г. - Программирование на языке ассемблера для микроЭВМ
Юров В. Ассемблер Практикум
Юров В. Ассемблер Учебник

Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
15.11.2017, 21:29
общий
Адресаты:
Использование программных прерываний внутри аппаратных - запрещено, т.к. у них более низкий приоритет
Дело не в этом...
Досовское прерывание 21h НЕРЕЕНТЕРАБЕЛЬНОЕ, т.е. при вызове досовского прерывания в любой момент времени (а аппаратные прерывания так и работают) вполне можно прервать работу другого вызова 21h (или своего, или системы, ДОС же тоже крутится), что может привести к несанкционнированному изменению данных.
Впрочем, не все функции нельзя использовать... Функции вывода на экран вполне допустимы
Но лучше все же вызов прерывания 21h в аппаратных прерываниях не использовать... Если уж очень надо, то необходимо использовать специальное средство для контроля повторного вхождения Что особо необходимо при файловых операциях.
Для вывода на экран в прерываниях лучше пользоваться int 10h или int 29h.
А лучше всего не делать ничего лишнего в аппаратных прерываниях. Меньше вероятность сделать ошибку.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401339
51
16.11.2017, 16:01
общий
16.11.2017, 16:02
Адресаты:
Уважаемый Игорь Витальевич,
здравствуйте,

1) в Вашем коде-программе, который выводит скан-код нажатой клавиши через int 16h - я разобрался - мне понравился трюк со следующими командами:

Код:
   and   al,0fh
PrHDig: add al, 90h
daa
adc al, 040h
daa


насколько я понял - эти команды использованы для того, чтобы найти соответствие в таблице ASCII-кодов ?

2) так же я открыл для себя новое - неявно-объявленная процедура вложенная в другую процедуру - в Си и Фортране такого нет (там есть только отдельные функции-сабрутины, которые выделяются в отдельные логические блоки).

3) далее попытаюсь самостоятельно разобраться а) в Вашем коде вывода скен-кодов (и нажатия, и отпускания) через обработчик клавиатуры, и б) в коде Константина Николаевича.
если будут вопросы (наверное будут), то задам их на мини-форуме.

4) Константину Николаевичу большое спасибо за список литературы по Ассемблеру - обязательно сделаю search в Интернете.

5) я немного отойду от темы и позволю себе задать общий вопрос - неужели с помощью Ассемблера(ов) можно разрабатывать (писать source code) Операционные Системы Реального Времени для военных электронных продуктов ?

Спасибо.
давно
Посетитель
401339
51
16.11.2017, 17:54
общий
16.11.2017, 17:55
Адресаты:
Уважаемый Игорь Витальевич,
добрый вечер,

разбирался в Вашем коде вывода скен-кодов (для нажатия и отпускания) с обработчиком клавиатуры. возникли вопросы. прошу Вас помочь разобраться,

Код:
   push ax ; какое значение регистра AX заносится в стек ?
in al,60h ; в регистр AL заносится полный (8-битный) скен-код нажатой клавиши, не так ли ?
push ax
;-------------------------------------------------------------------------------------
;
in al,61h ; 7-ой читаемый старший бит описывает блокировку (1-да, 0-нет) клавиатуры
mov ah,al ; но здесь этот 7-ой бит при нажатии равен 0, то есть клавиатура разблокирована ?
or al,80h ; это эквивалентно замене 7-ого старшего бита в AL на "1", то есть блокировка клавиатуры
out 61h,al ; здесь клавиатура официально блокируется
xchg ah,al ; здесь в AL в 7-ой старший бит записывается первоначальное значение "0"
out 61h,al ; здесь клавиатура официально разблокировывается

Игорь Витальевич, к сожалению пока я не знаю как работает микросхема Intel 8255 - в Интернете я не нашел полного описания функционирования данного контроллера, который отвечает за работу клавиатуры, динамика звука и т.д. поэтому прошу Вас помочь разобраться в этом участке Вашего кода - я не могу понять, что значит и когда клавиатура блокируется и разблокировывается (то есть открывается) ?

Спасибо.
давно
Посетитель
7438
7205
16.11.2017, 19:25
общий
Адресаты:
Цитата из Р. Джордейна
В момент вызова прерывания скан-код будет находиться в порте A (адрес 60h). Поэтому сначала надо этот код прочитать и сохранить на стеке. Затем используется порт B (адрес 61H), чтобы быстро послать сигнал подтверждения микропроцессору клавиатуры. Надо просто установить бит 7 в 1, а затем сразу изменить его назад в 0. Заметим, что бит 6 порта B управляет сигналом часов клавиатуры. Он всегда должен быть установлен в 1, иначе клавиатура будет выключена. Эти адреса портов применимы и к AT, хотя он и не имеет микросхемы интерфейса с периферией 8255.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401339
51
16.11.2017, 21:24
общий
Адресаты:
Уважаемый Игорь Витальевич,
добрый вечер,

спасибо большое за линк к справочнику-книге Р.Джордейна. книга похоже интересная и рассчитана на профессионалов. пока я бегло просмотрел главы 1-4, не вникая в подробности. в дальнейшем постараюсь понять детали функционирования программируемой микросхемы Intel 8255.

данная микросхема очевидно разрабатывалась (принципиальная радио-микро-схема ) в 1960-70-е годы и выпуск данной микросхемы был налажен в середине 1970-х годов - для чего возможно в Америке использовались различные слова-термины - к сожалению, новичкам бывает непросто ориентироваться в потоке-"океане" различных понятий-слов-терминов, порой обозначающих одно и тоже, а порой совсем устаревшие вещи (например, электронные детали), которые использовались только в прошлом.
в дальнейшем из Интернета постараюсь узнать, разницу в терминах "микросхема", "перепрограммируемая микросхема", "микроконтроллер", "микросхемы на перепрограммируемой логике" и т.д.
Форма ответа