Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/55: Рейтинг темы: голосов - 55, средняя оценка - 4.53
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031

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

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

Студворк — интернет-сервис помощи студентам
Расскажите, пожалуйста, как работать с портами 60h,61h,62h,63h,64h. И ещё, пример обработчика Int 9h, который что-то делает по кой-то клавише.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.05.2012, 10:06
Ответы с готовыми решениями:

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

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

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

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

Добавлено через 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
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
26.05.2012, 13:09  [ТС]
Цитата Сообщение от Fatal Error Посмотреть сообщение
я тему создал про обработчик 9 прерывания, можешь глянуть (он пробел опускает)
Да, смотрел эту тему, только без комментов было, а я в портах не спец.

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

Добавлено через 3 минуты
кстати, а у тебя первый исходник работает? ато у меня тасм на 19 и 20 строку ругается
0
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
26.05.2012, 13:47  [ТС]
Цитата Сообщение от 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
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
26.05.2012, 13:53
у меня тоже, но я не стал все строки писать
0
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
26.05.2012, 13:55  [ТС]
Fatal Error, а ты откуды этот код взял?
0
 Аватар для Troll_Face
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
28.05.2012, 18:06
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.05.2012, 18:06
Помогаю со студенческими работами здесь

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

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

Перехват порта 61h
Вобщем: Я нашёл игру Supaplex (оригинал под DOS) и послушал музыку из неё. Мне понравилась музыка при помощи PC Speaker'а. Я могу её...

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

Работа с COM портами
Здравствуйте. Облазил много различных ресурсов в сети но не могу найти решение своей задачи. Есть батник: :begin @echo off ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru