Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
30 / 30 / 0
Регистрация: 12.04.2012
Сообщений: 84

Не могу выйти из собственного прерывания клавиатуры

23.10.2008, 13:33. Показов 3856. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здраствуйте! В ассемблере я новичок, больно не бейте!!!)))
Суть задачи:
вводит некоторую строку на экран, при нажатии клавиши Esc выход из программы, а при нажатии клавиши SpaceBar реализовать временную задержку и послее (паузы) продолжить вывод строки!
Проблема: пи нажатии Esc прога завершается нормально, как только я нажимаю SpaceBar или любую другую клавишу прога виснет и словно не выходи из собственного прерывания.
Текст:
Code
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
;*************************************************************
    delay   macro time
    local   ext, iter
        push    cx
        mov cx,time         ;число итераций внешнего цикла
    ext:
        push    cx
        mov cx, 5000        ;число итераций внутреннего цикла
    iter:
        loop    iter
        pop cx
        loop    ext
        pop cx
        
     endm                   ;конец макроса
    ;***************************************************************
 
    .286
    dseg    segment                     ; заголовок сегмента данных
    msg db  20,?,20 dup(?)
    s   db  20 dup (?)      ;введенная строка
    cur_row db  ?            ;текущая строка курсора
    cur_col db  ?            ;текущий столбец курсора
    old_09h dw  ?,?          ;4 байта для хранения старого вектора
    exitf   db  ?            ; флаг досрочного завершения
    per db  ?
    s1  db  'pause $'
        ends                     ; конец сегмента данных
        ;------------------------------
       cseg segment                  ; заголовок сегмента команд
        assume  ds:dseg,cs:cseg      ; объявление pег. сегментов
       ;
       main proc                     ; начало командных стpок
    
        mov ax, seg dseg         ; инициализация pег сегм ds
        mov ds, ax
        xor     ax, ax
        
        ;инизиализация видеорежима, очистка экрана и создание фона
        mov ax,0003h
        int 10h
 
        
        mov bx, 00020h      ;формирование синего фона на экране
        mov     cx, 07d0h       ;2000 символов пробела
        mov     ax, 0920h
        int     10h
 
        ;сохранение параметров курсора и его скрытие
        mov ah, 03h         ;функция считывания параметров курсора
        xor     bh, bh          ;на 0 видеостранице
        int 10h
        mov cur_row, dh     ;в dh сохранили текущую строку курсора
        mov cur_col, dl     ;в dl сохранили текущую строку курсора
        mov ah, 01h         ;функция задания параметров курсора
        mov cx, 2000h       ;скрыть курсор
        int 10h
        
        ;вводим строку  символов
        lea dx, msg
        mov ah, 0ah
        int 21h
 
        ;введенную строку поместим в s
        mov cl,msg[1]           ;n[1] реальное количество введенных символов
        mov ch,0
        mov bx,0
        mov bp,2
    c:
        mov dh,msg[bp]
        mov s[bx],dh
        inc bx
        inc bp
        loop c
 
        mov s[bx],'$'
    
        ;очистка экрана
        mov ax,0003h
        int 10h
    da:
        ;установка параметров для вывода в центре экрана
        mov ah, 02h         ;функция установки позиции курсора
        mov dx, 0c23h
        int 10h
        
        ;вывод строки в центре
        lea dx, s           ;смещение строки в сегменте DS
        mov ah, 9
        int 21h
        
        
        ;перевод курсора
                                                                   
                mov ah,02h                       ; функция 02h установка позиции курсора
                mov bh,0                         ; BH номер видеостраницы(0 - основная)
                mov dh,2                        ; DH строка курсора
                mov dl,1                         ; DL столбец курсора
                int 10h                          ; номер прерывания 
 
        mov per,3
        
        ;************************************************************************
        ;программа будет выполняться, пока не нажата Esc(выход) или SpaceBar(пауза)
    
    dal:
        
        ;замена векторов ТВП
        cli             ;запрет прерываний
        push    es          ;сохранение значения регистра ES
        mov ax,3509h        ;функция DOS, получающая вектор int09h из ТВП
        int 21h
 
        mov old_09h[0], bx      ;сохранение старого смещения
        mov old_09h[2], es      ;сохранение старого сегмента
        pop es
 
        mov dx,offset new_09h   ;получение в DX нового смещения
        push    ds          ;сохранение значения в DS
        mov ax,cs           ;получение в DS нового сегмента
        mov ds,ax           
        mov ax,2509h        ;функция DOS, устанавливающая новый вектор int09h 
        int 21h
 
        pop ds
        sti
 
        ;выполнение программы (пустые вложенные циклы)
        ;здесь буду вызывать генератор сч и тамер и выводить
 
        mov cx,0ffffh
    cycle_out:
        push    cx
        mov cx,0ffffh
    cycle_in:
        loop    cycle_in
        pop cx
        loop    cycle_out
 
    
        lea dx,s
        mov ah,9
        int     21h
            
    
        ;перевод курсора
                                                                   
                mov ah,02h                       ; функция 02h установка позиции курсора
                mov bh,0                         ; BH номер видеостраницы(0 - основная)
                mov dh,per                        ; DH строка курсора
                mov dl,per                         ; DL столбец курсора
                int 10h                          ; номер прерывания 
 
        inc per
 
        
        jmp dal
        
        ;завершение программы
    finish:
        cli
        mov dx, old_09h[0]
        mov ds, old_09h[2]  
        mov ax, 2509h
        int 21h
        sti
        mov ah, 4ch          ; выход в DOS
        int 21h
 
 
    main endp
 
 
 
 
 
 
        ;************************************************************************
        ;новый обработчик аппаратного прерывания
 
    new_09h proc
        sti             ;разрешение прерываний
        pushf               ;сохранение регистра флагов
        pusha               ;сохранение регистров общего назначения
        mov exitf,00h       ;обнуление флага
        in  al,60h          ;чтение скан-кода
        cmp al,39h          ;клавиша SpaceBar ?
        je  my_code         ;да реализовать задержку
        cmp al, 01h         ;клавиша esc
        jnz old_int         ;нет вызвать системный обработчик
        or  exitf,01h       ;установка флага
        jmp my_code     
    old_int:
        popa                ;воссстановление РОН
        popf                ;восстановление регистра флага
        jmp dword ptr old_09h   ;переход к системному обработчику
    my_code:
        in  al,61h          ;извлечение содержимого из порта
        or  al,80h          ;установка бита 7
        jmp $+2         ;задежка для аппаратуры
        out 61h,al          ;сброс сигнала "клава занята"
        and al,80h          ;сброс бита 7
        jmp $+2         ;задержка для аппаратуры
        out 61h,al          ;восстановление содержимого порта
        cli             ;запрет прерываний
        mov al,20h          ;сигнал "конец прерываний"
        out 20h,al          ;в управляющий порт контроллера
        sti             ;разрешение прерываний  
        
 
        ;отработка клавиши esc
        cmp exitf,01h       ;проверка флага выхода
        je  finish          ;завершение программы
        ;отработка клавиши SpaceBar
        mov ah, 01h         ;функция задания параметров курсора
        mov cx, 2000h       ;скрыть курсор
        int 10h
        jmp old_int
        delay   76
        
        popa
        popf
        sti
        
        iret
        
    new_09h endp
 
        
 
        ends                 ; конец сегм команд
        end main             ; физический конец пpогpаммы
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.10.2008, 13:33
Ответы с готовыми решениями:

Написание собственного прерывания
Доброго времени суток. Нужно написать собственное прерывание, которое выводит на экран строку. Написать, вроде, написал, но при прогоне в...

Написание собственного прерывания (проверьте)
Здравствуйте! Задание состоит в том, что надо написать новый обработчик прерывания, заменить им существующий, после чего восстановить...

Как выйти из прерывания по внешнему сигналу?
Всем добрый день. Подскажите пожалуйста как завершить прерывание и вернуться в основной цикл программы. void main(void)...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.10.2008, 13:33
Помогаю со студенческими работами здесь

Вызов звука по нажатию клавиш Control+C (создание собственного прерывания)
Задача состоит в генерации звука из динамика по нажатию комбинации клавиш Control+C (удержание первой и нажатие второй). Код писал по...

Обработчик прерывания клавиатуры
По идее обработчик отлавливает нажатие на клавишу SHIFT и устанавливает соответствующий бит в слове флагов клавиатуры, но он этого не...

Перекрывание прерывания клавиатуры
Нужно перекрыть прерывание клавиатуры, чтобы при вводе строки игнорировались гласные буквы. Не могли бы вы объяснить как это вообще...

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

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


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru