Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Виталий_Виталий
0 / 0 / 0
Регистрация: 13.04.2013
Сообщений: 1
1

Перехват прерываний (клавиатура)

16.04.2013, 20:12. Просмотров 1010. Ответов 1
Метки нет (Все метки)

Доброго времени суток. Есть код, который при нажатии определённых кнопок меняет цвет, а нужно сделать программу, которая при нажатии кнопки от 0 до 9 будет превращать цифру в последовательность точек и тире(примерно как азбука Морзе).
0 − − − − − 5 • • • • •
1 • − − − − 6 − • • • •
2 • • − − − 7 − − • • •
3 • • • − − 8 − − − • •
4 • • • • − 9 − − − − •
Данная задача очень мне интересна, но моих навыков не хватает.
Вот код (на комментарии не обращайте внимания) :
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
;===========================================================================
;Програма буде виконувати зафарбовування супроводжуючого тексту червоним кольором при натисненні клавіші F1 (відповідно синім кольором - при натисненні F2) 
; та забезпечувати вихід з програми при натисненні клавіші Esc
;===========================================================================
 .386
 esc_key    equ 01h     ; скан-код клавіші Esc
 F1_key     equ 3bh ; клавіша F1
 F2_key     equ 3ch ; клавіша F2
 
 RED        equ     0ceh    ; 0Ach  ; коди кольорів
 BLUE       equ     0b9h    ; 0F9h
 GREEN      equ     0a5h    ; 0E5h
 
 
_ST SEGMENT para    STACK 'stack' use16
    dw  32000 dup (?)
_ST         ENDS
 
 
_DATA   SEGMENT para 'DATA'     use16
 msg        db  'Press:',10,13      ; текст повідомлення
        db  'ESC - for exit.',10,13
        db  'F1 - fill by red color.',10,13
        db  'F2 - fill by blue color.',10,13,'$'
_DATA ENDS
 
 
_TEXT    SEGMENT    para 'CODE' use16
ASSUME  CS:_TEXT,DS:_DATA,SS:_ST
 
setint9 PROC
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; процедура "перехоплення" переривання від клавіатури і встановлення вектора ; переривань прикладного обробника 
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MOV AH,35H      ; отримати вектор переривання
    MOV AL,9        ; переривання від клавіатури (9) N=9
    INT 21H         ; значення, що повертається:
                ; es:bx - вказівник на системну процедуру
                ; обробки переривання від клавіатури
 
    mov cs:int9ptr,bx    ; зберегти в сегменті кодів вказівник 
    mov cs:int9ptr+2,es     ; на системну процедуру
 
    mov dx,offset userint9
    push ds
    push cs         ; ds:dx - вказівник на процедуру користувача    
    pop ds      ; оброб. переривання від клавіатури
 
    MOV AH,25H      ; встановити вектор "перехоплення"
    MOV AL,9        ; переривання від клавіатури (9) N=9
    INT 21H 
    pop ds
 
    ret
  int9ptr   dw 2 dup (?)
 
setint9 ENDP
 
retint9 PROC
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;  процедура відновлення попереднього (системного)
;  вектора переривання від клавіатури
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    push ds
    push dx
    mov dx,cs:int9ptr   ; ds:dx - вказівник на початкову (системну)
    mov ax,cs:int9ptr+2 ; процедуру обробки переривання від
    mov ds,ax       ; клавіатури
    
 
    MOV AH,25H      ; встановити вектор системної процедури
    MOV AL,9        ; обробки переривання від клавіатури
    INT 21H     
 
    pop dx
    pop ds
 
    ret
retint9 ENDP
 
userint9    proc    far
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Процедура обробки переривань від клавіатури,
; викликається при будь-якому натисканні або відтисканні клавіш клавіатури,
; здійснює повернення в MS-DOS після натискання клавіші Esc
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    pushf
    call    dword ptr cs:int9ptr        ; виклик основного обработчика
                    ; преривання клавіатури
                    ; (для занесення символу в буфер)  
    pushad
                    ; читання порту клавіатури
    in  al,60h          ; введення скан-коду клавіші - розряди 0-6
    mov ah,al           ; 7-ий розряд дорівнює 0 при натисканні
 
    push    ax          ; скан-код клавіші
    push    3832            ; позиція виведення - правий нижній кут
    call    show            ; виведення скан-коду на екран
    
    cmp ah,esc_key      ; якщо натиснуто Еsc
    je  short ui9020        ; вихід з програми
 
    cmp ah,F1_key       ; натиснуто F1
    je  short ui_F1
 
    cmp ah,F2_key       ; натиснуто F2
    je  short ui_F2
 
    jmp ui9040
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ui9020:
    call    retint9     ; повернення системного вектора переривання
    mov     ax,4c00h        ; вихід з програми
    int     21h 
 
; або вихід при використанні cycle в якості фонової процедури :
;ui9020:
    ;mov  cs:cont,1     ; вихід з програми при ESC
    ;jmp ui9040;
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ui_F1:      ; виведення для контролю посередині екрану ASCII коду символів
    push    'F1'        ; букви "F" та цифри "1" у 16-вому коді
    push    2000        ; позиція на екрані
    call    show        ; виведення
 
    push    RED     ; фарбування відповідно екрану і символів
    call    fill
    jmp short ui9040
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ui_F2:      ; виведення для контролю посередині екрану ASCII коду символів
    push    'F2'        ; букви "F" та цифри "2" у 16-вому коді
    push    2160        ; позиція на екрані
    call    show        ; виведення
    
    push    BLUE        ; фарбування відповідно екрану і символів
    call    fill
 
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ui9040:
    popad
    iret            ; закінчення обробки переривання
userint9    endp 
show    proc    near        
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;процедура виведення коду натиснутої клавіші
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
    push    bp
    mov     bp,sp
    pusha
    push    es
    mov     ax,0b800h   ; адреса віеопам'яті
    mov     es,ax
 
    std         ; запис відбудеться справа-наліво
ls20:
    mov     di,[bp+4]       ; точка виведення
    mov     bx,[bp+6]       ; те, що ми виводимо у 16-му коді
    mov     cx,4
    mov     ah,0ah      ; зелений колір символу, чорний - фону
ls40:
    mov     al,bl       ; обробка молодшого байту символу
    and     al,00001111b    ; виділили молодшу тетраду (число від 0 до 15)
    cmp     al,10       ; чи число більше за 10
    jl  ls100       ; якщо менше – просто виводимо
    add     al,7        ; якщо літера, то виводимо як символ літери
ls100:
    add     al,30h      ; оскільки скан-коди цифр починаються з 30h
    stosw           ; зберігаємо за адресою es:di значення ax
    shr     bx,4        ; наступна тетрада
    loop    ls40
 
    pop     es
    popa
    pop     bp
    ret     4
show  endp
 
fill    proc    near        
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;процедура зміни атрибутів кольору тексту на екрані
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    push    bp
    mov     bp,sp
    pushad
    push    es
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    push    0b800h
    pop es
    
    mov ax,[bp+4]       ; атрибути кольору
    cld         ; заповнення атрибутів йде зліва-направо
    xor di,di
 @go:   
    inc     di
    stosb           ; запис за адресою es:di значення al
    cmp     di,4000 ; доки не опрацьовано весь екран=80*25*2
    jl      @go
 
    pop     es
    popad
    pop     bp
    ret 2
fill    endp
 
;- - - - - - - - - - - - - Початок роботи програми - - - - - - - - - - - - - 
begin:
    mov     ax,_data
    mov     ds,ax
 
    mov     ax,3        ; задати текстовий режим 80 на 25
    int     10h
 
    mov     ah,10h      ; відключити режим миготіння
    mov     al,3
    mov     bl,0
    int     10h
 
    mov ah,09h      ; вивести повідомлення msg
    mov dx,offset msg   
    int 21h
 
    cli             ; заборона переривань
    call    setint9     ; "перехоплення" int9
    sti         ; дозвіл переривань
    push    GREEN       ; початкові установки вигляду екрану
    call    fill
    call    fon     ; запуск фонової процедури (див. нижче !!!!!)
    cli
    call    retint9     ; відновлення системного вектора переривань
    sti 
    mov     ax,4c00h        ; вихід з програми
    int     21h
 
 
;В якості фонових процедур можуть бути використані наступні два альтернативні приклади.
 
;Приклад 1.Cycle.
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Виконується нескінченний цикл з виведенням у правому верхньому куті екрану 
; поточного вмісту регістру cx e 16-му коді.
; Завершення циклу – при зміні зовні (обробником) значення 
; змінної cont
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
cont    db  0       ; cont - змінна нескінченного циклу
cycle   proc    near
    mov cont,0
    mov cx,0        ; деяке початкове значення лічильника сх
 
begin_fon:
    add cx,1h       ; зміна сх
 
    push    cx      ; виведення на екран стану регістра сх
    push    310 
    call    show
 
    mov al,cs:cont
    and al,1        ; зациклювання
    je  begin_fon
finish:
    mov ah,2
    int 21h
    ret
 
 ;cont  db  ?       ; cont - змінна нескінченного циклу
cycle   endp
 
 
;Приклад 2.Print_text.
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;Процедура, що виводить на екран символьне позначення клавіш 
;(окрім функціональних)
;натискання ctrl+x(Х) – вихід з циклу і програми
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
print_text proc near    
printing:   
    mov ah,10h      ; зчитування скан-коду натиснутої клавіші
    int 16h
    cmp al,18h      ; скан-код ctrl+x(Х) – вихід з циклу і програми
    je  short @exit
 
    or  al,al       ; якщо символ функціональний, то не обробляємо
    je printing     ; його цією процедурою
    mov dl,al       ; якщо це літера, цифра тощо
    mov ah,02h      ; виводимо символ
    int 21h
    jmp printing
 @exit:
    ret
print_text  endp
 
_TEXT ENDS
    end  begin
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2013, 20:12
Ответы с готовыми решениями:

Перехват прерываний, работа с таймером
Здравствуйте, а вы мне не поможете разобраться в чем у меня ошибка, ниже приведен код на...

Задача про перехват прерываний (TASM)
Добрый вечер, очень рассчитываю на вашу помощь. Задание такое: Сам к сожалению, в этой теме...

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

Перехват прерываний от клавиатуры и работа с видеопамятью
Здравствуйте)) Помогите мне, пожалуйста, с лабораторной)) Вот задание: Заполнить 0-ю страницу...

обработчик прерываний
Скопировал обработчик прерывания с Калашникова, а он не работает. В чом проблема??? (работаю в выне)

1
Charles Kludge
Клюг
7647 / 3162 / 383
Регистрация: 03.05.2011
Сообщений: 8,382
17.04.2013, 00:52 2
Феерично. ~300строк ни о чём. Зачем перехвытывать int 9, если прога - не резидент? И да, перехват int 9 не моден уже лет ~20 как, под мультитаскерами более прилично юзать int 15/ah=4Fh, если уж на то пошло.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2013, 00:52

Таблица прерываний в PM
Работает вот такая таблица! dd 0,0 ; 0 dw syscall_handler, 08h,...

обработчик прерываний
вообщем создал код обработчика прерываний,который должен менять последнюю строку 10-ю разными...

Обработчик прерываний
Задача: написать обработчик прерываний, заменяющий вектор прерывания от часов (1СН) и выводящий на...


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

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

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