Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
programmisto
92 / 137 / 0
Регистрация: 15.04.2012
Сообщений: 1,032
1

Работа с портами 60h,61h,62h,63h,64h

26.05.2012, 10:06. Просмотров 4147. Ответов 7
Метки нет (Все метки)

Расскажите, пожалуйста, как работать с портами 60h,61h,62h,63h,64h. И ещё, пример обработчика Int 9h, который что-то делает по кой-то клавише.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2012, 10:06
Ответы с готовыми решениями:

Описать работу OUT 60h,AL на железе. Работа с клавиатурой.
Вопрос такой: написана команда обращения по адресу OUT 60h,AL описать ее работу на железе. Что...

работа с портами
Контролер ЕЛТ имеет порт адреса 3д4 в который записывает номер регистра элт которому будет...

Прерывание int 60h
Всем привет. Я никак не могу найти, что делает это прерывание. Может кто-нибудь подскажет? Я...

Чтение из порта 60h
Есть такая задачка. Собственно, как можно считать из порта скан-код? Через что это реализуется?...

Работа с USB портами
Мне нужно написать программу которая отключала бы и включала USB порты, но проблема в получении...

7
Troll_Face
603 / 403 / 8
Регистрация: 26.04.2012
Сообщений: 2,069
26.05.2012, 10:25 2
и мне про это тоже интересно, а особенно про кольцевой буфер клавиатуры. (гуглил, но все равно с трудом понимаю)

Добавлено через 1 минуту
programmisto, я тему создал про обработчик 9 прерывания, можешь глянуть (он пробел опускает)

Добавлено через 7 минут
обработчик прерывания от клавиатуры, который при каждом
нажатии клавиши реагирует на нее только один раз
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
segm segment para public 'code'
assume cs:segm,ds:segm
org 100h
start:jmp init
mas db 128 dup (0) ; массив для хранения нажатий
old09 dd ? ; адрес старого обработчика
sign dw 0fedch ; сигнатура
Int09 proc far
sti
push ax
push bx
push dx
push di
push es
mov ax,40h
mov es,ax
in al,60h ; считаем scan-код из порта
mov ah,al ; проверим, что это не управляющая
IRP
X,<1DH,2AH,36H,3BH,3CH,3DH,3EH,3FH,40H,41H,42H,43H,44H>
cmp ah,X ; клавиша, и, если да, проигнорируем
je ignor ; для этого используем циклическую
ENDM ; макрогенерацию
cmp ah,01h ; если нажата ESC
je sbros ; перейдем на метку sbros
cbw ; расширим scan-код до слова
lea bx,cs:[mas] ; загрузим в bx адрес начала массива
mov si,ax ; в si scan-код – индекс в массиве
mov dh,byte ptr cs:[bx][si] ; из массива в dh поместим
cmp dh,0 ; флаг нажатия и сравним его с 0
jne ignor ; если нажата клавиша – ее игнорируем
mov byte ptr cs:[bx][si],1 ; иначе установим флаг
jmp pass ; и перейдем к стандартному обработчику
ignor:
in al,61h ; подтвердим обработку scan-кода
mov ah,al
or al,80h
out 61h,al
mov al,ah
out 61h,al
cli
mov al,20h ; пошлем EOI в контроллер прерываний
out 20h,al
pop es
pop di
pop dx
pop bx
pop ax
iret
sbros:
lea bx,cs:[mas] ; в bx загрузим адрес начала массива
mov si,0
REPT 128 ; и сбросим флаги нажатий всех
mov byte ptr cs:[bx][si],0 ; клавиш
inc si
ENDM
pass:
pop es
pop di
pop dx
pop bx
pop ax
jmp cs:[old09] ; передадим управление стандартному
Int09 endp ; обработчику
init:
mov ax,3509h ; проверим адрес обработчика int 09h
int 21h
mov ax,es:[bx-2] ; это наш обработчик в памяти?
cmp ax,cs:sign
je outmem ; если наш – на выгрузку
mov word ptr old09,bx ; системный – сохраним его
mov word ptr old09+2,es ; адрес в двойном слове old09
mov bx,cs
mov ds,bx ; установим ds на наш сегмент
mov dx,offset int09 ; в dx поместим адрес нашей ISR
mov ax,2509h ; и запишем адреса в вектор
int 21h ; прерываний
lea dx, init
int 27h ; оставим резидентно
outmem: ; выгрузка
mov dx, word ptr es:old09
mov bx, word ptr es:old09+2
mov ds,bx
mov ax,2509h ; запись в вектор прерываний
int 21h ; адреса стандартного обработчика
push es
mov es,es:[2Ch] ; выгрузка окружения
mov ah,49h
int 21h
pop es
mov ah,49h ; выгрузка программы
int 21h
int 20h
segm ends
end start
обработчик прерывания от клавиатуры, инвертирующий действие
клавиши Caps Lock.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
old_9int dd ? ;для хранения адреса обработчика старого
;прерывания 09h
;Обработчик прерывания
new_9int proc far
push ax ;сохраняем регистры в стеке
push bx
push di
push es
sti ;разрешить прерывания
pushf ;для iret в системном прерывании
call cs:[old_9int] ;вызов системного прерывания
mov ax,40h ;устанавливаем регистр es на область
;данных BIOS
mov es,ax
mov di,es:[1ch];получаем указатель на голову
cmp di,01Eh ;он указывает на начало буфера?
jne minus2 ;если нет, то для доступа к только
89
mov di,03Ch ;что помещенным в буфер scan и ascii-
;кодам необходимо отнять 2 от нового “хвоста”
jmp el ;иначе старый “хвост” указывал на
minus2: sub di,2 ;конец буфера, что и запишем в di
;и перейдем на el.
el: mov ax,es:[di] ;cчитаем scan код из буфера клавиатуры
mov bl,01000000b ;запишем в bl для test строку с
;установленным 6 битом
test es:[17h],bl ;в слове флагов клавиатуры есть
;признак нажатия CapsLock
jz Caps_NO ;если 0 , то CapsLock не нажата
cmp al,41h ;проверка, что буква от A до Z
jb do ;если нет , то выход – на метку do
cmp al,5ah
ja do
add al,32 ;если буквы большие, то прибавим к
mov es:[di],ax ;ascii-коду 32, получим маленькую
;букву и запишем в буфер
jmp do ;перейдем на конец
Caps_NO: ;Caps Lock не нажат
cmp al,61h ;проверка что буква в буфере от a до z
jb do ;если нет , то переход на метку do
cmp al,7ah
ja do
sub al,32 ;отнимем от ascii-кода 32 - получим
mov es:[di],ax ;большую букву и запишем в буфер
do: cli ;запретить прерывания
mov al,20h ;выдаем сигнал о завершении
out 20h,al ;аппаратного прерывания
pop es ;восстанавливаем регистры из стека
pop di
pop bx
pop ax
iret ;возврат из прерывания
new_9int endp
1
programmisto
92 / 137 / 0
Регистрация: 15.04.2012
Сообщений: 1,032
26.05.2012, 13:09  [ТС] 3
Цитата Сообщение от Fatal Error Посмотреть сообщение
я тему создал про обработчик 9 прерывания, можешь глянуть (он пробел опускает)
Да, смотрел эту тему, только без комментов было, а я в портах не спец.

А за код в этом посте спасибо.
0
Troll_Face
603 / 403 / 8
Регистрация: 26.04.2012
Сообщений: 2,069
26.05.2012, 13:36 4
Цитата Сообщение от programmisto Посмотреть сообщение
а я в портах не спец.
я и сам не понимаю многое с этими портами

Добавлено через 3 минуты
кстати, а у тебя первый исходник работает? ато у меня тасм на 19 и 20 строку ругается
0
programmisto
92 / 137 / 0
Регистрация: 15.04.2012
Сообщений: 1,032
26.05.2012, 13:47  [ТС] 5
Цитата Сообщение от Fatal Error Посмотреть сообщение
кстати, а у тебя первый исходник работает? ато у меня тасм на 19 и 20 строку ругается
Нет, он у меня ещё и на 21 и 23 строки ругается:
(19)Missing dummy argument
(20)Illegal instruction
(21)Undefined symbol:X
(23)Can't use this outside macro
0
Troll_Face
603 / 403 / 8
Регистрация: 26.04.2012
Сообщений: 2,069
26.05.2012, 13:53 6
у меня тоже, но я не стал все строки писать
0
programmisto
92 / 137 / 0
Регистрация: 15.04.2012
Сообщений: 1,032
26.05.2012, 13:55  [ТС] 7
Fatal Error, а ты откуды этот код взял?
0
Troll_Face
603 / 403 / 8
Регистрация: 26.04.2012
Сообщений: 2,069
28.05.2012, 18:06 8
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
segm segment para public 'code'
assume cs:segm,ds:segm
org 100h
start:jmp init
mas db 128 dup (0) ; массив для хранения нажатий
old09 dd ? ; адрес старого обработчика
sign dw 0fedch ; сигнатура
Int09 proc far
sti
push ax
push bx
push dx
push di
push es
mov ax,40h
mov es,ax
in al,60h ; считаем scan-код из порта
mov ah,al ; проверим, что это не управляющая
IRP X,<1DH,2AH,36H,3BH,3CH,3DH,3EH,3FH,40H,41H,42H,43H,44H>
cmp ah,X ; клавиша, и, если да, проигнорируем
je ignor ; для этого используем циклическую
ENDM ; макрогенерацию
cmp ah,01h ; если нажата ESC
je sbros ; перейдем на метку sbros
cbw ; расширим scan-код до слова
lea bx,cs:[mas] ; загрузим в bx адрес начала массива
mov si,ax ; в si scan-код – индекс в массиве
mov dh,byte ptr cs:[bx][si] ; из массива в dh поместим
cmp dh,0 ; флаг нажатия и сравним его с 0
jne ignor ; если нажата клавиша – ее игнорируем
mov byte ptr cs:[bx][si],1 ; иначе установим флаг
jmp pass ; и перейдем к стандартному обработчику
ignor:
in al,61h ; подтвердим обработку scan-кода
mov ah,al
or al,80h
out 61h,al
mov al,ah
out 61h,al
cli
mov al,20h ; пошлем EOI в контроллер прерываний
out 20h,al
pop es
pop di
pop dx
pop bx
pop ax
iret
sbros:
lea bx,cs:[mas] ; в bx загрузим адрес начала массива
mov si,0
REPT 128 ; и сбросим флаги нажатий всех
mov byte ptr cs:[bx][si],0 ; клавиш
inc si
ENDM
pass:
pop es
pop di
pop dx
pop bx
pop ax
jmp cs:[old09] ; передадим управление стандартному
Int09 endp ; обработчику
init:
mov ax,3509h ; проверим адрес обработчика int 09h
int 21h
mov ax,es:[bx-2] ; это наш обработчик в памяти?
cmp ax,cs:sign
je outmem ; если наш – на выгрузку
mov word ptr old09,bx ; системный – сохраним его
mov word ptr old09+2,es ; адрес в двойном слове old09
mov bx,cs
mov ds,bx ; установим ds на наш сегмент
mov dx,offset int09 ; в dx поместим адрес нашей ISR
mov ax,2509h ; и запишем адреса в вектор
int 21h ; прерываний
lea dx, init
int 27h ; оставим резидентно
outmem: ; выгрузка
mov dx, word ptr es:old09
mov bx, word ptr es:old09+2
mov ds,bx
mov ax,2509h ; запись в вектор прерываний
int 21h ; адреса стандартного обработчика
push es
mov es,es:[2Ch] ; выгрузка окружения
mov ah,49h
int 21h
pop es
mov ah,49h ; выгрузка программы
int 21h
int 20h
segm ends
end start
0
28.05.2012, 18:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2012, 18:06

Работа с портами ввода вывода
Всем привет! Такой вопрос, неужели под виндой при наличии стандартных драйверов нет возможности...

Чтение скан-кодов из порта 60h
Для подтверждения, что скан-код считан в 61h необходимо послать подтверждение: in al, 61h mov ah,...

Добровольное переключение 60h очередь с жестко заданными приоритетами
задание: добровольное переключение 60h очередь с жестко заданными приоритетами и два процесса. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru