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

Собственный обработчик прерывания клавиатуры - закрыть программу по нажатию ESC

11.11.2014, 20:20. Показов 3147. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Изменить код так, чтобы по нажатию клавиши esc программа закрывалась

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
Data segment
    time dw 18              ;переменная таймера 18,2 сигнаа в секунду (5 секунд - это 91 прерываение)
    txt  db " ", 13,10,"$"
    cnt  dw 10              ;для счетчика смещения
    trii dw 0
    SAVE_CS DW 0            ;сохраняем сегмент заменяемого прерывания
    SAVE_IP DW 0            ;сохраняем смещение прерывания
    tmp dw 0
Data ends
 
code segment
start: assume cs:code, ds: data, es:stk
    mov AX, data
    mov DS, AX
;сохраняем вектор - сохраняем исходные прерывания
    mov AH, 25h         ;функция получения вектора
    mov AL, 8h          ;номер вектора
    int 21h             ;
    mov SAVE_IP, BX     ;запоминаем смещение в BX
    mov SAVE_CS, ES     ;запоминаем сегмент в ES
 
    push DS
    mov DX,offset rout      ;смещение для процедуры в DX
    mov AX, seg rout        ;помещаем сегмент процедуры в DS
    mov DS, AX
    mov AH, 25h         ;в AH-> функцию установки вектора
    mov AL, 8h          ;в AL-> номер вектора
    int 21h             ;т.е. поменяли прерывание
    pop DS
 
B:
jmp B
 
rout proc far
    push AX             ;сохраняем все измененные регистры
    push DX
    dec time
    cmp time, 0
    jnz nxt
        dec cnt
        mov AX, 18
        mov time, AX
        inc BX          
        inc tmp      
        mov AX, tmp
        mul tmp
    
        jc codeend          ;если не влезает в сетку
        mov trii, AX
        call PrintNumber    ;вызов процедуры вывода на экран числа из AX
        mov AH, 9h
        lea DX, txt 
        int 21h
    nxt:
    pop DX
    pop AX              ;восстановили регистры
    mov AL, 20h         ;аппартаное прерывание 
    out 20h, AL         ;
    iret                ;для восстановления сохраненных командой int регистров флагов
rout endp
 
 
PrintNumber proc        ;процедура показа числа из AX
    push BX             ;сохраняем содержимое регистров в стек, чтобы потом вернуть их
    push DX
    push SI
    push CX
    mov CX, 0           ;инициализируем цикл
    mov BX, 10          ;в BX заносим основание системы счисления
loophere:               ;основной цикл
    mov DX, 0           ;обнуляем DX
    div BX              ;делим на 10
    
    push AX             ;результат в стеке
    add DL, "0"         ;конвертируем последнюю цифру в ASCII-код
 
    pop AX              ;вернем AX
    push DX             ;сохраним DX
    inc CX              ;увеличим CX на 1
    cmp AX, 0           ;повторяем для всех цифр числа
jnz loophere
    mov AH, 2           ;DOS-функция вывода символа
loophere2:
    pop DX              ;восстанавливливаем цифры от последней к первой и 
    mov AH, 02h         ;выводим их на экран
    int 21h
 
loop loophere2
 
    pop CX
    pop SI
    pop DX
    pop BX
     ret
PrintNumber endp            
 
codeend:                ;восстанавливаем исходный вектор
    CLI
    push DS
    mov DX, SAVE_IP
    mov AX, SAVE_CS
    mov DS, AX
    mov AH, 25h
    mov AL, 1ch
    int 21h
    pop DS
    STI
 
mov AX, 4ch
int 21h
 
code ends
    
stk segment stack
        db 256 dup ("*")
stk ends
 
end start
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.11.2014, 20:20
Ответы с готовыми решениями:

Организовать собственный обработчик прерывания от клавиатуры
Нужно организовать собственный обработчик прерывания от клавиатуры, не используя прерывание int 16h. Объясните, как это реализовать. как...

Закрыть модальную форму по нажатию Esc
Суть, при нажатии Esc - закрывать форму (вызванную модально) Как реализовать? контролов много, писать для каждого событие KeyUp не дело

Собственный обработчик запросов прерывания от часов 1Ch и с печать сообщения на экран
Здравствуйте, помогите пожалуйста с созданием собственного обработчика запросов прерывания. Нужно создать собственный обработчик...

1
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
11.11.2014, 21:47
1.Вешать свой обработчик таймера на int8 - некорректно, пошло и вышло из моды с появлением 286+. Перевешивайте на int 1Ch.
2. Перед меткой nxt: , после печати значения таймера, вызываете Int 16/AH=01h, и, если клавиша нажата, записывыете сканкод в к-нибудь байтик в сегменте кода.
3. В цикле
Цитата Сообщение от newb4x Посмотреть сообщение
B:
jmp B
анализируете вышеупомянутый байтик, и, если он равен 1(скaнкод <Esc>), то восстанавлиавете вектор прерывания и выходите.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.11.2014, 21:47
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
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, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru