Консультация № 191643
01.11.2017, 14:57
0.00 руб.
0 21 1
Здравствуйте, уважаемые эксперты!

Прошу вас ответить на следующие вопросы по книге О.А.Калашникова, глава 10:

1) правильно ли я понимаю, что "резидентная программа" - это либо com- либо exe-программа находящаяся в ОЗУ после запуска данной программы и после соответственно нажатия клавиши Enter ?

2) и что "резидентная программа" продолжает выполняться, находясь в ОЗУ в режиме реального времени то есть имеется какая то связь на исполнение "резидентной программы" в микропроцессоре в реальном времени ?

3) что значит "программа находится в ОЗУ" ? она (программа) выполняется в настоящее время в микропроцессоре или что-то другое ?

4) параграф 10.3,
Код:
... резидентная программа должна перехватывать то или иное прерывание, с тем, чтобы программист или другие программы могли обратиться к ней.

Код:
Прерывание — это своего рода процедура (подпрограмма), которая имеет не название (например, print_string), а номер.

как Вы объясняли ранее, прерывание - это не совсем процедура, а скорее прерывание можно определить как последовательность определенных асемблеровских команд.
вопросы -
а) правильно ли я понимаю, что прерывание (последовательность команд) можно написать-определить на ассемблере точно также как и процедуру - вообще говоря и в частности ? или прерывание пре-определено заранее каким-либо образом ? каким образом ?
б) что значит "резидентная программа должна перехватывать то или иное прерывание" ?
в) я не могу понять каким образом резидентная программа, которая является обычной com- или exe-программой-файлом и которая находится в ОЗУ в режиме реального времени, может перехватывать совершенно другую последовательность команд (прерывание) ?
г) что значит "перехватывать прерывание" ?
д) почему "должна перехватывать" ?
е) как понять и что значит "с тем, чтобы программист или другие программы могли обратиться к ней (то есть к резидентной программе)" ?
ж) как понять и что значит - "могли обратиться к ней" ?
з) каким образом и как программист или другие программы могут обращаться к программе (резидентной), которая уже находится в ОЗУ, то есть в режиме исполнения в реальном-то времени ?
и) что значит "обращаться" (к резидентной программе) ?
к) что значит "ничто не мешает программисту перехватить ... прерывание ..." ? как программист может перехватить программный процесс (прерывание) ? это происходит в режиме реального времени ? или все-таки правильнее сказать, что не программист перехватывает прерывание, а это делает все-таки резидентная программа, которая находится в ОЗУ ?

Спасибо.

Обсуждение

давно
Старший Модератор
31795
6196
01.11.2017, 16:31
общий
Адресаты:
Вот Вам погремушка:
[code lang=asm h=300]model tiny
.code
org 100h
begin: mov ax,3
int 10h
mov ax,3509h
int 21h
mov old09o,bx
mov old09s,es
mov ax,2509h
lea dx,new09
int 21h
mov ah,9
lea dx,dbMes
int 21h
mov ah,10
lea dx,dbStr
int 21h
mov ax,2509h
mov dx,old09o
mov ds,old09s
int 21h
ret
old09o dw ?
old09s dw ?
dbMes db 10,10,13,'Enter string:$'
dbStr db 120,?,120 dup(?)
new09: push es
push ax
mov ax,0B800h
mov es,ax
in al,60h
push ax
and al,7Fh
cmp al,1eh
pop ax
mov ah,'T'
jnz @@01
and al,80h
jz @@00
mov ah,'F'
@@00: mov al,ah
mov ah,0fh
mov es:[10h],ax
@@01: pop ax
pop es
jmp dword ptr cs:[old09o]
end begin[/code]
Программа вешается на обработчик клавиатуры и следит за клавишей "А"-латинской или "Ф"-русской.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
01.11.2017, 16:34
общий
01.11.2017, 16:40
Адресаты:
буква 'T' - клавиша нажата, 'F' - клавиша отпущена.
Попробуйте разобратся.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
401339
51
01.11.2017, 18:12
общий
Адресаты:
Уважаемый Константин Николаевич,
здравствуйте,

1) спасибо за Ваш код. интуитивно чувствую, что он не сложный.
2) моя проблема в настоящее время в том, что я не знаком с функциями прерываний int 10h и int 21h. где (в какой книге или на каком сайте) можно посмотреть описание функций данных прерываний ?
3)
Код:
 
mov ax,2509h
mov dx,old09o (=bx)
mov ds,old09s (=es)
int 21h


один из вопросов - зачем нужна 2-ая и 3-я строки ? являются ли они параметрами для прерывания int 21h ?
4) строки 11 и 12 в Вашем коде -
Код:
   mov   old09o,bx 
mov old09s,es
mov ax,2509h
lea dx,new09
int 21h

эквивалентно
Код:
   mov   old09o,bx 
mov old09s,es
mov ax,2509h
mov dx,offset new09
int 21h

насколько я понимаю - то именно эти строки являются принципиальными (главными) в Вашем коде ?
5) строка 10 в Вашем коде - эта функция мне не известна, поэтому я не понимаю, что она делает.
6) строка 11 - это эквивалентно тому, что заместо строки 11 подставляются строки 28-47. не так ли ? правильно ли я понимаю суть дела ?
7) строка 32 - что это за команда "in" ? (в Интернете я не нашел описание этой команды)
8) строки 34 и 39 - что это за команда "and" ? что она делает-выполняет ?
9) в строка 32-45 происходит "игра-манипуляции" с регистром AX=(AH,AL).
10) строки 32-35 - здесь мне не понятны шестнадцатиричные числа, точнее их назначение - очевидно это какие то функции какого-то прерывания ?
11) что делает строка 37 ? точнее каково ее назначение ?
12) строка 39 - что делает-выполняет данная строка ? что описывает соответствующее шестнадцатиричное значение ?
13) строки 37 и 41 - прошу обратить внимание - никакой A-латинской и Ф-русской там нет. этот сюрприз мне не понятен ?
14) мне также не понятна "игра" в строках 42-47. особенно в строках 43,44,47.
15) строки 16-17 мне не понятны - что это за функции прерывания int 21h ?
16) мне не понятно описание строки 27. как читать данную строку ? что она делает ?
17) в строке 26 - мне не понятны параметры "db, 10, 10, 13 ...". для чего они нужны ? какова их функция ?
18) строки 19-21 - мне не известны данные функции прерывания int 21h. что делают данные функции ?

Спасибо.


давно
Посетитель
7438
7205
01.11.2017, 18:54
общий
Адресаты:
моя проблема в настоящее время в том, что я не знаком с функциями прерываний int 10h и int 21h. где (в какой книге или на каком сайте) можно посмотреть описание функций данных прерываний ?
А интернет на что? Держите: 21h, 10h
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
01.11.2017, 20:06
общий
Адресаты:
Цитата: Ильдар Рифович Альмиев
моя проблема в настоящее время в том, что я не знаком с функциями прерываний int 10h и int 21h. где (в какой книге или на каком сайте) можно посмотреть описание функций данных прерываний ?

Ну да, конечно.

191433, прерывание 0х10;
А первые Ваши вопросы - 0х21.
[code lang=asm h=300]model tiny
.code
org 100h
begin: mov ax,3 ; устанавливаем третий режим, принудительно
int 10h
mov ax,3509h;читаем вектор прерывания аппаратного обработчика клавиатуры
int 21h
mov old09o,bx;запоминаем его
mov old09s,es ;сегмент :смещение
mov ax,2509h;устанавливаем свой обработчик
lea dx,new09
int 21h
mov ah,9 ;выводим строку для красоты с сообщением
lea dx,dbMes
int 21h
mov ah,10 ;читаем строку пользователя
lea dx,dbStr
int 21h
mov ax,2509h;возвращаем старый обработчик
mov dx,old09o
mov ds,old09s
int 21h
ret ;выход
old09o dw ?
old09s dw ?
dbMes db 10,10,13,'Enter string:$'
dbStr db 120,?,120 dup(?)
new09: push es
push ax
mov ax,0B800h;адресуем сегмент на видео буфер
mov es,ax
in al,60h;читаем порт контролера клавиатуры
push ax
and al,7Fh:получаем скен-код клавиши
cmp al,1eh;это клавиша А-Ф
pop ax
mov ah,'T' ;считаем что клавиша нажата
jnz @@01;нет не наша клавиша
and al,80h;проверяем признак нажатия-отпускания клавиши
jz @@00;нажата переход
mov ah,'F' ;отпущенна
@@00: mov al,ah
mov ah,0fh
mov es:[10h],ax ;ну тут как с рожицей
@@01: pop ax
pop es
jmp dword ptr cs:[old09o] ;передаем управление старому обработчику
end begin[/code]
Поиграйтесь с самим кодом, в смысле посмотреть как он работает. Он как раз о перехвате прерываний, привилегиях прерываний, и ещё много всего.
По прерывания скачайте книгу Данкан Р. Профессиональная работа в MS-DOS, там есть прерывания и DOS и BIOS
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
401339
51
02.11.2017, 06:36
общий
02.11.2017, 08:42
Адресаты:
Уважаемые Константин Николаевич и Игорь Витальевич,
добрый день,

1) спасибо за Ваши ответы-консультации.
2) чувствую, что мне придется немного потрудиться в смысле самостоятельной работы .
3) насколько я понимаю, Ваш код написан для TASM ? значит мне уже пора познакомиться и с TASM. спасибо-спасибо .
4) книгу Данкана скачал, спасибо. .
5) в дальнейшем надеюсь на Ваше взаимопонимание если у меня возникнут вопросы в смысле понимания (understanding) работы ассемблера и другие вопросы технического характера.

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

Спасибо еще раз за Ваши замечания и помощь.

давно
Посетитель
401339
51
02.11.2017, 07:37
общий
Адресаты:
Уважаемый Константин Николаевич,
здравствуйте,

1) в Интернете нашел программу для TASM - "Hello, World !" - хотелось бы начать изучение TASM и его синтаксис с простых программ,

http://www.codenet.ru/progr/asm/tasm/3.php

Код:
dosseg
.model small
.stack 100h

.data
Message db 'Hello, World !',13,10,'$'

.code
mov ax,@data
mov dx,ax

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

mov ah,4ch
int 21h

end

2) команды "tasm hello01.asm" и "tlink hello01.obj" работают без ошибок, получается hello01.exe файл.
3) однако когда я запускаю данный исполняемый файл в DosBoxe (для Windows 7 (64-bit)) получаются псевдо-символы (мусор).
4) я пробовал использовать отладчик afdpro.exe - он тоже показывает "мусор" в своем правом нижнем окошке.
5) в чем моя ошибка ? или это проблема Windows 7 (хотя я использую DosBox) ?

прошу Вашей помощи, чтобы разобраться с TASM .

Спасибо.
Прикрепленные файлы:
3ddd39fcfefbb2fa403c89f70a352148.jpg
давно
Посетитель
401339
51
02.11.2017, 07:51
общий
02.11.2017, 07:54
Адресаты:
Уважаемый Константин Николаевич,
добрый день,

1) я пробовал компилировать Ваш код, используя MASM - но он выдает кучу непонятных мне ошибок - поэтому насколько я понимаю, Ваш код адаптирован к TASM. не так ли ?
2) компиляция Вашего кода, используя tasm.exe code_v.asm, тоже выдает ошибку. что это значит ? (code_v.asm - это Ваш код).

прошу Вашей помощи для того, чтобы разобраться с данной проблемой. .

Спасибо.
Прикрепленные файлы:
c30408026898bd3da17e7ad6bd9af7eb.jpg
давно
Посетитель
401339
51
02.11.2017, 09:28
общий
Адресаты:
Уважаемые Константин Николаевич и Игорь Витальевич,
добрый день,

1) понимаю, что Вы являетесь экспертами по Ассемблеру и военной электронике и для Вас все это, связанное с низкоуровневым программированием, является простым и очевидным в понимании работы и функционирования Ассемблера и железа.
2) тем не менее прошу Вас "не гнать мой велосипед" в смысле обучения Ассемблеру - глава 10 - это сложная тема. в настоящее время моя загвоздка - на уровне понимания определений-понятий-терминов и как они (понятия) работают, то есть каков их принцип работы (говоря-объясняя простыми словами).
3) в Интернете много чего нет по Ассемблеру - вопросы, которые я поднимаю в мини-форумах практически не объясняются в Интернете, да и доступной литературы очень мало - имеется только то, что Вы рекомендуете.
4) Константин Николаевич, как я Вам и говорил ранее меня интересует не только простое программирование Ассемблера, но и программирование "железа" - для меня это сложные темы в настоящее время,
5) конечно я разберусь с работой диода и транзисторов (биполярного и полевого) - однако мне хотелось бы это делать с пониманием деталей, то есть заглянуть внутрь полупроводниковых приборов, даже на квантовый уровень. поэтому я переключаюсь также на изучение схемотехники и физики твердого тела (квантовый уровень),
6) также наверное Вы со мной согласитесь, что даже аналоговая схемотехника с использованием диодов и транзисторов не является простой темой для изучения - в процессе изучения простых схемотехнических решений-радиосхем мне приходится выводить формулы или хотя бы визуально представить их вывод, так как меня интересует не радиолюбителство, а радиоинженерия (радиопроектировка-разработка).
7) извините что, я трачу много времени на схемотехнику и физику твердого тела, но я не вижу иного пути к познанию и накоплению опыта работы с Ассемблером, ибо как я Вам и ранее говорил - мне хотелось бы стать специалистом не только по Windows-овским Ассемблерам, но и по программированию любого другого "железа" и по разработке радио- и микро-электроники.
8) в настоящее время, я - новичок в этом деле, и это все мне кажется сложным делом. поэтому я и трачу на освоение деталей много времени.

Спасибо за Ваше взаимопонимание.
давно
Посетитель
401339
51
03.11.2017, 03:46
общий
Адресаты:
Уважаемый Константин Николаевич,
здравствуйте,

1) проблему связанную с "Hello World" в TASM решил ... с помощью Интернета. научился создавать com-файлы в TASM. знакомлюсь с директивами MODEL, SEGMENT ... в TASM-е. немножко что-то да и получается, возникает интерес у самого.
2) также знакомлюсь с полевым транзистором (МДП), принципом его работы, вывод формул и т.д. - это новое для меня. интерес к этому есть.

Спасибо за Ваше взаимопонимание.
давно
Посетитель
401339
51
04.11.2017, 09:28
общий
Адресаты:
Уважаемый Константин Николаевич,
здравстуйте,

1) внимательно поизучал Ваш код - у Вас в коде в строке 34 опечатка.
2) наверное Вы с Игорь Витальевичем "немного" поизучали меня в Интернете и захотели сделать мне подарок к 100-летию Великой Октябрьской Социалистической революции в виде изучения (мною) Вашего кода, точнее той богатой научно-технической и военной информации, которая стоит за этим. . I appreciate your research task given to me. Thank you very much.
3) Константин Николаевич, исправив опечатку в Вашем коде, я использовал TASM -
tasm code01.asm
tlink /t/x code01.obj
в результате получился com-файл.
4) для новичков я немного бы модифицировал этот код - введя директивы SEGMENT and ASSUME вместо сокращенных записей типа ".code" - это нужно для лучшего понимания и закрепления понятия сегментальной модели RAM в старых компьютерах.
5) что касается Вашего задания мне - в виде Вашего кода - то ... наверное мне надо будет познакомиться-изучить разработку (радио и микро-электронику) видеокарт ... видеопамяти ... и что за этим стоит (физика, математика, материалы, химия, обработка сигналов (теория и практика-электроника-лазеры-плазма-электродинамика), криптография и т.д.) - то есть Советские науку, технику, и военные оборону и промышленность.

P.S.: надеюсь, что в дальнейшем мне можно будет обращаться к Вам за советами и консультациями по Ассемблеру.

Спасибо.
давно
Посетитель
7438
7205
04.11.2017, 12:28
общий
Адресаты:
Да, конечно, Ильдус, обращайтесь. Мы рады Вам помочь

Только будет к Вам пожелание: давайте отделим мух от котлет
Будем говорить только о программировании. И обо всем, что за этим стоит: о командах, алгоритмах, об ОС, БИОС, логическом строении памяти и т.п.
И не будем распыляться на физику строения, электронику, химию, лазеры и т.п. Это к теме не относится.
Это замечательно, что Вам хочется во всем этом разобраться, но это не поможет научиться программировать...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
04.11.2017, 13:59
общий
Цитата: Ильдар Рифович Альмиев
внимательно поизучал Ваш код - у Вас в коде в строке 34 опечатка.

В чем опечатка?
[code lang=asm]and al,7Fh;получаем скен-код клавиши[/code]
Если Вы о двоеточии, то комментарии писал уже в хроме, поэтому могло проскочить.


4)
Цитата: Ильдар Рифович Альмиев
для новичков я немного бы модифицировал этот код - введя директивы SEGMENT and ASSUME вместо сокращенных записей типа ".code" - это нужно для лучшего понимания и закрепления понятия сегментальной модели RAM в старых компьютерах.

Вы сами писали, что
Цитата: Ильдар Рифович Альмиев
мне хотелось бы стать специалистом не только по Windows-овским Ассемблерам, но и по программированию любого другого "железа" и по разработке радио- и микро-электроники.

SEGMENT and ASSUME это директивы устаревшие и для новичком полное их описание трудновато для понимания.
Вот директива MODEL и упрощенные директивы описания сегментов .CODE, .DATA, .STACK, скрывают от новичков различного рода тонкости и особенности генерации кода, заставляя их заниматся только программированием. Вот простой пример:
[code lang=asm]model small
.stack 256
.code
begin: mov ax,@data
mov ds,ax
;
mov ah,09
lea dx,db1
int 21h
.data
db1 db 10,13,'this one$'
.code
mov ah,09
lea dx,db2
int 21h
.data
db2 db 10,13,'this two$'
.code
mov ax,4C00h
int 21h
end begin[/code]
Компилятор все САМ правильно расставит по своим сегментам и создаст код. Вы обратите внимание на красоту и читаемость кода, на таком примере, она не заметна, но представьте 1000 строчек кода, и у Вас несколько десятков выводов различных строк и КАЖДЫЙ раз Вам нужно будет листать в сегмент данных и смотреть, что там Вы выводите. А так все рядом и наглядно, остальное за Вас сделает компилятор.

Цитата: Ильдар Рифович Альмиев
что касается Вашего задания мне - в виде Вашего кода

В коде устанавливается обработчик прерывания контролера клавиатуры, он нигде явно не вызывается. Работать он начинает, тогда когда программа пользователя находится в прерывании ввода строки и пользователь должен стучать по клавиатуре. Каждый раз когда нажимается или отпускается клавиша - аппаратно генерируется прерывание и наш обработчик получает управление, проанализировав код нажатой клавиши он выводит информацию об этом.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
401339
51
04.11.2017, 21:26
общий
04.11.2017, 21:27
Адресаты:
Уважаемые Игорь Витальевич и Константин Николаевич,
здравствуйте,

1) спасибо за Ваши сообщения.

2) меня зовут Ильдар, а не Ильдус.

3) у меня имеется "небольшой" опыт программирования на Си и Фортране для физико-математических задач в операционной системе Linux. для общего интереса и развития немного пробовал программировать графику используя библиотеку GTK. но это было в прошлом. в настоящее время (как уже пять лет) я ушел из профессиональной науки, так как в науке в России нет никакой перспективы - очень маленькие зарплаты для обычных простых научных сотрудников (а не заведующих кафедр и администрации Вузов и их фаворитов) и отсутствие свободы делать науку по той теме, которая интересовала бы только самого - это фактически и есть финансовый и административный терроризм со стороны Государства - России.

4)
Код:
Если Вы о двоеточии, то комментарии писал уже в хроме, поэтому могло проскочить.

это бывает.

5)
Код:
Только будет к Вам пожелание: давайте отделим мух от котлет ... это (лазеры, химия и т.д.) не поможет научиться программировать... 

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

6)
Код:
SEGMENT and ASSUME это директивы устаревшие и для новичков полное их описание трудновато для понимания.

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

7)
Код:
... но представьте 1000 строчек кода, и у Вас несколько десятков выводов различных строк и КАЖДЫЙ раз Вам нужно будет листать в сегмент данных и смотреть, что там Вы выводите.

спорить не буду, так как это дело вкуса. но мое мнение следующее - когда имеется большой код (много строк в общей сложности), то его надо разбивать на части (процедуры и сегменты), затем каждую процедуру записывать в отдельный файл. после этого надо написать Makefile (в Linux) или bat-файл (в Windows) и запускать его для компиляции и линковки ассемблеровских (asm и obj) файлов. имея такой опыт подхода к программированию на Си-Фортране в Линуксе, могу сказать, что это упрощает работу и дисциплинирует программиста к вниманию, порядку и самоответственности.

8)
Код:
... В коде устанавливается обработчик прерывания контролера клавиатуры, он нигде явно не вызывается. 

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

Спасибо.
давно
Посетитель
401339
51
05.11.2017, 17:25
общий
05.11.2017, 17:32
Адресаты:
Уважаемый Константин Николаевич,
здравствуйте,

прошу помочь разобраться в вопросах по Вашему коду.

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

2) вопросы (я не нашел ответы в Интернете) -
Код:
 in al,60h ;читаем порт контролера клавиатуры 
push ax
and al,7Fh ;получаем скен-код клавиши

я понимаю что делает команда "and" - это по-битовое умножение, или в логике - И.
а) в чем назначение и цель строки "and al,7Fh " ?
ведь эта строка эквивалентна AL=AL&7Fh, где & - операция побитового умножения.
б) почему именно число "7Fh", то есть какова функция-действие этого числа ? ведь исходя из первой строки "in al,60h" в нижнем регистре al уже находится байт информации, поступивший из 60h-го порта (то есть из консоли-клавиатуры).
в) что значит "получаем скен-код клавиши" ?
г) что такое "скен-код клавиши" ?

3)
Код:
and al,80h ; проверяем признак нажатия-отпускания клавиши 

а) для чего и с какой целью в данном случае используется операция побитового умножения или логическое И ? ведь эта строка эквивалентна операции AL=AL&80h.
б) что означает число "80h" ? какова его функция ?
в) почему Вы говорите, что "проверяем признак нажатия-отпускания клавиши" ? каким образом проверяем ?

Спасибо.
давно
Посетитель
401339
51
05.11.2017, 23:28
общий
Уважаемый Константин Николаевич,
добрый вечер,

прошу помочь разобраться в вопросах по Ассемблеру по Вашему коду, и по книге О.А.Калашникова, параграф 15.5.2,

1)
Код:
 in al,60h ;читаем порт контролера клавиатуры 
push ax
and al,7Fh ;получаем скен-код клавиши

ну, хорошо, ... 7Fh = 01111111b,
и для чего это, плюс ко всему, нужно?
ведь команда "in al, 60h" уже занесла в регистр AL скен-код (scancode) клавиши.
AL = AL & 01111111b - эта команда приведет лишь к тому, что восьмой бит (слева) обнулится.

2)
Код:
   in al,60h;читаем порт контролера клавиатуры 
push ax
and al,7Fh:получаем скен-код клавиши
cmp al,1eh;это клавиша А-Ф
pop ax
mov ah,'T' ;считаем что клавиша нажата
jnz @@01;нет не наша клавиша
and al,80h; проверяем признак нажатия-отпускания клавиши
jz @@00 ; нажата переход
mov ah,'F' ;отпущенна
@@00: mov al,ah

Код:
and al,80h;проверяем признак нажатия-отпускания клавиши 

ну, хорошо, ... 80h = 10000000b,
и для чего это нужно ? AL = AL & 10000000b,
эта команда "and al,80h" приведет лишь к тому, что первые (справа отсчет) семь бит в регистре AL обнулятся, а восьмой-старший бит останется прежним.
"; проверяем признак нажатия-отпускания клавиши" - если я не ошибаюсь, то здесь ничего не проверяется, а лишь происходит побитовое умножение ? или я не прав ?
следующая команда "jz @@00 ; нажата переход " ведь должна реагировать на команду "cmp al,1eh; это клавиша А-Ф", которая в свою очередь устанавливает флаги ? или я не прав ? если я не прав, тот на какую команду реагирует команда "jz @@00 ; нажата переход" ?

Спасибо.
давно
Посетитель
401339
51
05.11.2017, 23:31
общий
Адресаты:
Уважаемый Константин Николаевич,
добрый вечер,

прошу помочь разобраться в вопросах по Ассемблеру по Вашему коду, и по книге О.А.Калашникова, параграф 15.5.2,

1)
Код:

in al,60h ;читаем порт контролера клавиатуры
push ax
and al,7Fh ;получаем скен-код клавиши

ну, хорошо, ... 7Fh = 01111111b,
и для чего это, плюс ко всему, нужно?
ведь команда "in al, 60h" уже занесла в регистр AL скен-код (scancode) клавиши.
AL = AL & 01111111b - эта команда приведет лишь к тому, что восьмой бит (слева) обнулится.

2)
Код:

in al,60h;читаем порт контролера клавиатуры
push ax
and al,7Fh:получаем скен-код клавиши
cmp al,1eh;это клавиша А-Ф
pop ax
mov ah,'T' ;считаем что клавиша нажата
jnz @@01;нет не наша клавиша
and al,80h; проверяем признак нажатия-отпускания клавиши
jz @@00 ; нажата переход
mov ah,'F' ;отпущенна
@@00: mov al,ah

Код:

and al,80h;проверяем признак нажатия-отпускания клавиши

ну, хорошо, ... 80h = 10000000b,
и для чего это нужно ? AL = AL & 10000000b,
эта команда "and al,80h" приведет лишь к тому, что первые (справа отсчет) семь бит в регистре AL обнулятся, а восьмой-старший бит останется прежним.

"; проверяем признак нажатия-отпускания клавиши" - если я не ошибаюсь, то здесь ничего не проверяется, а лишь происходит побитовое умножение ? или я не прав ?

следующая команда "jz @@00 ; нажата переход " ведь должна реагировать на команду "cmp al,1eh; это клавиша А-Ф", которая в свою очередь устанавливает флаги ? или я не прав ? если я не прав, тот на какую команду реагирует команда "jz @@00 ; нажата переход" ?

Спасибо.
давно
Старший Модератор
31795
6196
06.11.2017, 10:49
общий
это ответ
Здравствуйте, ialmiev!
Следующий код демонстрирует работу резидентов:
[code lang=asm]model tiny
.code
org 100h
begin: mov ax,3 ; устанавливаем третий режим, принудительно
int 10h
mov ax,3509h;читаем вектор прерывания аппаратного обработчика клавиатуры
int 21h
mov old09o,bx;запоминаем его
mov old09s,es ;сегмент :смещение
mov ax,2509h;устанавливаем свой обработчик
lea dx,new09
int 21h
mov ah,9 ;выводим строку для красоты с сообщением
lea dx,dbMes
int 21h
mov ah,10 ;читаем строку пользователя
lea dx,dbStr
int 21h
mov ax,2509h;возвращаем старый обработчик
mov dx,old09o
mov ds,old09s
int 21h
ret ;выход
old09o dw ?
old09s dw ?
dbMes db 10,10,13,'Enter string:$'
dbStr db 120,?,120 dup(?)
new09: push es
push ax
mov ax,0B800h;адресуем сегмент на видео буфер
mov es,ax
in al,60h;читаем порт контролера клавиатуры
push ax
and al,7Fh;получаем скен-код клавиши
cmp al,1eh;это клавиша А-Ф
pop ax
mov ah,'T' ;считаем что клавиша нажата
jnz @@01;нет не наша клавиша
and al,80h;проверяем признак нажатия-отпускания клавиши
jz @@00;нажата переход
mov ah,'F' ;отпущенна
@@00: mov al,ah
mov ah,0fh
mov es:[10h],ax ;ну тут как с рожицей
@@01: pop ax
pop es
jmp dword ptr cs:[old09o] ;передаем управление старому обработчику
end begin[/code]
Установив свой обработчик на контролер клавиатуры, запускается подпрограмма ввода строки. Каждый раз когда нажимается -
отпускается клавиша, получает управление наш обработчик. Прочитав скен-код клавиши( у каждой клавиши свой, это потом система определяет в соответствии с режимами: верхний-нижний регистр, русская-английская раскладка и т.д.), наш обработчик выделяет сам код клавиши- младшие семь бит, также определяет нажата или отпущена клавиша - старший бит и выводит результат с помощью прямой записи в видео буфер. Наше обрабатываемое событие клавиша А-Ф. И только потом обработчик передает управление старому обработчику клавиатуры, чтобы система могла обработать полностью само событие.

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

давно
Посетитель
7438
7205
06.11.2017, 11:32
общий
06.11.2017, 11:34
Адресаты:
Здравствуйте, Ильдар!
Прошу прощения, что назвал Вас Ильдус Перепутал с другим Альдиевым.

Помогу немного Константину Николаевичу, отвечу на Ваши вопросы:
1)
ну, хорошо, ... 7Fh = 01111111b
Дело в том, что скен-код посылается и при нажатии, и при отпускании.
При отпускании записывается старший бит (то бишь, делается or 80h)
Вот чтобы убрать этот бит (и считать код, как при нажатии, так и при отпускании) и делаем and 7fh
2) ответ смотрите выше
Только добавлю, далее мы анализируем этот старший бит, чтобы понять: у нас нажатие или отпускание
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401339
51
06.11.2017, 12:35
общий
Адресаты:
Уважаемый Игорь Витальевич,
здравствуйте,

1) спасибо за Ваше сообщение.

2) с Вашей помощью и с помощью Константина Николаевича и Интернета я полностью разобрался в Вашем коде.

3) я с Вами согласен, что скен-коды (scan code, scancode) у нажатой клавиши и отпущенной (той же) клавиши отличаются.

4) для семейства IBM PC XT код отпущенной клавиши получается путем записи единицы "1" в старший (восьмой) бит скен-кода, соответствующего той же клавиши при нажатии.

5) у семейства IBM PC AT скен-коды клавиши при нажатии и отпускании не получаются методом 3) - вообще говоря они разные. поэтому программисты Ассемблера, раньше, в 1970-80 -е года имели полные таблицы скен-кодов при нажатии и отпускании разных клавиш клавиатур.

P.S.: Игорь Витальевич, для новичков я бы объяснил так, что работая с произвольным "железом", надо знать (то есть иметь в руках соответствующую детальную техническую документацию) заранее скен-коды клавиш клавиатуры (консоли) при нажатии (press regime) и при отпускании (release regime), так как вообще говоря они (скен-коды) необязательно могут получаться методом 3). это все зависит от электронного-схемотехнического решения-разработки (на уровне микросхем и их подсоединения к общей архитектуре "железа") той или иной версии компьютера или другого "железа".

Спасибо.
давно
Посетитель
7438
7205
06.11.2017, 12:58
общий
Адресаты:
Вообще-то коды формируются программно, "железо" в клавиатуре - это просто матрица.
Опрашивает матрицу и формирует скен-код программа, которая "сканирует" эту матрицу, отсюда и название скен-код.
Разумеется, можно реализовать все по-разному. Но данный подход с кодированием старшим битом нажатия/отпускания является
стандартом. Отпускание важно для таких кнопок, как shift, ctrl

Немного по другому кодируются "расширенные" клавиши, типа F1-F12, клавиши цифровой клавиатуры.
Там формируются два, а то и больше байт кода.

В качестве упражнения можете написать программку, которая будет выводить на экран все получаемые коды, лучше в виде HEX.
Все поймете сами
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа