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

Записать свой обработчик нажатия Ctrl-Break, который выводит сообщение

01.03.2021, 23:11. Показов 5005. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Помогите пожалуйста с заданием: Изменить адрес диспетчера по Ctrl-Break. Записать свой обработчик. При нажатии на Ctrl-Break должно выдаваться сообщение/!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.03.2021, 23:11
Ответы с готовыми решениями:

Разработать программу, которая не реагирует на нажатия клавиш Ctrl+Break и Ctrl+C
И мне помогите пожалуйста)) На входном языке Assembler разработать программу, которая не реагирует на нажатия клавиш Ctrl+Break и Ctrl+C....

Резидентный обработчик прерывания, который выводит последнее сообщение экрана
Может кто-нибудь помочь бесплатно найти или решить эту задачу? Заранее спасибо за помощь! Разработать резидентный обработчик прерывания,...

Ctrl+C Ctrl+Break в WriteConsoleInput ReadConsoleInput
Как послать Ctrl+C Ctrl+Break в WriteConsoleInput ? Пытался поймать с помощью ReadConsoleInput, возвращает TRUE, но NumberOfEventsWritten...

6
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
05.03.2021, 17:28
Лучший ответ Сообщение было отмечено Azot-8778 как решение

Решение

Нормально работает в консоли Windows XP, но не работает в DosBox
По нажатию Ctrl+C выводится сообщение "My Ctrl-Break was pressed"

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
    .286
    .model tiny
    .code
    org 100h
start:  jmp beg
msg1    db "Enter a letter",13,10,"$"
msg2    db 13,10,"Program terminated normally",13,10,"$"
msg3    db 7,13,10,"My Ctrl-Break was pressed",13,10,"$"
beg:    push cs
    pop  ds
    push cs
    pop  es
    mov ax,2523h ; Установка прерывания Ctrl-C
    mov dx,offset brkint
    int 21h
    mov dx,offset msg1 ; "Enter a letter"
    mov ah,9 ; Ожидание клавиши По Ctrl-C срабатывает brkint
    int 21h
    mov ah,1
    int 21h
    mov dx,offset msg2 ; "Program terminated normally"
    mov ah,9
    int 21h
    mov ax,4c00h
    int 21h
brkint: push ds ; прерывание 23h
    pusha
    push cs
    pop  ds
    cld
    mov  si,offset msg3
m0: lodsb
    cmp al,"$"
    jz m1
    mov ah,0Eh ; используется функция BIOS для вывода символа, а не DOS
    int 10h
    jmp m0
m1: popa
    pop ds
    iret
    end start
2
0 / 0 / 0
Регистрация: 21.02.2021
Сообщений: 5
09.03.2021, 02:47  [ТС]
Спасибо! А есть ли идеи как реализовать подобное на dosbox или emu8086?
0
0 / 0 / 0
Регистрация: 21.02.2021
Сообщений: 5
09.03.2021, 16:30  [ТС]
Доброго времени суток. Помогите пожалуйста с задачей. Нужно чтобы программа выводила сообщение при нажатии ctr-c / ctr-break в dosbox. Спасибо всем кто поможет!
0
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
09.03.2021, 19:29
Лучший ответ Сообщение было отмечено Azot-8778 как решение

Решение

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
; Прерывание Ctrl-Break (23h)
; Версия, работающая в DosBox 
 
    .286
    .model tiny
    .code
 
    org 100h
start:  jmp beg
trig db 1 ; триггер, чтобы прерывание сработало только 1 раз
msg1    db "Enter a letter",13,10,"$"
msg2    db 13,10,"Program terminated normally",13,10,"$"
msg3    db 7,13,10,"My Ctrl-Break was pressed",13,10,"$"
old1C   label dword
old1Cip  dw 0
old1Cseg dw 0
beg:push cs
    pop  ds
    push cs
    pop  es
    mov ax,351Ch ; установка нового прерывания по таймеру
    int 21h
    mov old1Cip,bx
    mov ax,es
    mov old1Cseg,ax
    mov dx,offset new1C
    mov ax,251Ch
    int 21h
    mov ax,2523h ; Установка прерывания Ctrl-C
    mov dx,offset brkint
    int 21h
    mov dx,offset msg1 ; "Enter a letter"
    mov ah,9 ; Ожидание клавиши По Ctrl (левому или правому) срабатывает brkint
    int 21h
    mov ah,1
    int 21h
    push ds  ; установка старого прерывания по таймеру
    mov dx,old1Cseg
    mov ds,dx
    mov dx,cs:old1Cip
    mov ax,251Ch
    int 21h
    pop ds
    mov dx,offset msg2 ; "Program terminated normally"
    mov ah,9
    int 21h
    mov ax,4c00h
    int 21h
 
brkint: push ds ; прерывание 23h
    pusha
    push cs
    pop  ds
    cld
    mov  si,offset msg3
m0: lodsb
    cmp al,"$"
    jz m1
    mov ah,0Eh ; используется функция BIOS для вывода символа, а не DOS
    int 10h
    jmp m0
m1: popa
    pop ds
    iret
 
; прерывание по таймеру
new1C:
    call kbrd
    jmp cs:old1C
 
kbrd:   pusha
    push es
    cmp cs:trig,0 ; ечли триггер сброшен, то ничего не делать
    jz m2
    mov ax,0
    mov es,ax
    mov al,es:[417h] ; 0000:0417h - флаг состояния клавиатуры
    test al,4 ; Ctrl нажат ?
    jz m2
    sti
    int 23h ; да, вызываем прерыание Ctrl-Break
    mov cs:trig,0 ; сбрасываем триггер, стобы вызов не сработал снова
m2: pop es
    popa
    ret
    end start
1
0 / 0 / 0
Регистрация: 21.02.2021
Сообщений: 5
09.03.2021, 22:23  [ТС]
Спасибо! А не подскажете зачем нужен таймер?
0
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
10.03.2021, 13:45
Таймер отслеживает состояние клавиши Ctrl. Обычно возникают проблемы с прерыванием клавиатуры INT 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
; Прерывание Ctrl-Break (23h)
; Версия, работающая в DosBox 
; На основе прерывания клавиатуры INT 9h
 
    .286
    .model tiny
    .code
 
 
keyc=46 ; скан-код клавиши C
 
    org 100h
start:  jmp beg
keyflag db 0 ; флаг "нажата горячая клавиша"
msg1    db "Enter a letter",13,10,"$"
msg2    db 13,10,"Program terminated normally",13,10,"$"
msg3    db 7,13,10,"My Ctrl-Break was pressed",13,10,"$"
old9     label dword
old9ip  dw 0
old9seg dw 0
 
 
beg:push cs
    pop  ds
    push cs
    pop  es
    mov ax,3509h ; установка нового прерывания по клавиатуре
    int 21h
    mov old9ip,bx
    mov ax,es
    mov old9seg,ax
    mov dx,offset new9
    mov ax,2509h
    int 21h
 
    mov ax,2523h ; Установка прерывания Ctrl-C
    mov dx,offset brkint
    int 21h
    mov dx,offset msg1 ; "Enter a letter"
    mov ah,9 ; Ожидание клавиши По Ctrl (левому или правому) срабатывает brkint
    int 21h
    mov ah,1
    int 21h
 
             ; установка старого прерывания по клавиатуре
    push ds
    mov dx,cs:old9seg
    mov ds,dx
    mov dx,cs:old9ip
    mov ax,2509h
    int 21h
    pop ds
 
    mov dx,offset msg2 ; "Program terminated normally"
    mov ah,9
    int 21h
    mov ax,4c00h
    int 21h
 
brkint: push ds ; прерывание 23h
    pusha
    push cs
    pop  ds
    cld
    mov  si,offset msg3
m0: lodsb
    cmp al,"$"
    jz m1
    mov ah,0Eh ; используется функция BIOS для вывода символа, а не DOS
    int 10h
    jmp m0
m1: popa
    pop ds
    iret
 
new9:   pusha
 
    push es
    mov ax,0
    mov es,ax
        mov al,es:[417h] ; 0000:0417h - флаг состояния клавиатуры
        test al,4 ; Ctrl нажат ?
    pop es
    jz  m4  ; Ctrl не нажат - нет реакции
 
    mov ah,1
    in al,60h ; опрос порта клавиатуры
if 0
    call show ; отладочный вывод скан-кода на экран
endif
    cmp al,keyc ; нажата Ctrl+C ?
    jz m3
m4: mov ah,0
m3: cmp ah,0
    jz m3a
 
    INT 23h ; да. вызов прерывания INT 23h
 
m3a:    mov cs:keyflag,ah
    popa
    jmp cs:old9 ; jmp на стандартный обработчик INT 9
 
if 0
show:   pusha
    mov cx,3
    mov bl,10
n1: mov ah,0
    div bl
    push ax
    loop n1
    mov cx,3
n2: pop ax
    mov al,ah
    add al,"0"
    mov ah,0Eh
    int 10h
    loop n2
    popa
    ret
endif
    end start
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.03.2021, 13:45
Помогаю со студенческими работами здесь

При нажатии на комбинацию клавиш Ctrl+L выводит на экран время, которое прошло с прошлого нажатия этой комбинации
Приветствую форумчан. Есть задание следующего содержания: Насколько я понимаю, то алгоритм такой: - создаем переменную, с...

Перехват Ctrl-C и Ctrl-Break
Нужна помощь с решением задачи, суть такова, что это должна быть консольная программа, которая бы реагировала на нажатие CTRL+C и...

Обработчик события нажатия на кнопку, который будет копировать текст из поля ввода в метку
3. Разместите на форме поле ввода (TextBox), метку (Label) и кнопку (Button). Создайте обработчик события нажатия на кнопку, который будет...

Как выдать сообщение до нажатия ctrl + alt+delete
как выдать сообщение до нажатия ctrl +alt+delete, после загрузки windows. Сохраняйте свои файлы на диске S.

Создайте обработчик события нажатия кнопки мыши на форме (Click), который будет очищать поле ввода
Делаю лабу: Разместите на форме поле ввода (TextBox), метку (Label) и кнопку (Button). Создайте обработчик события нажатия на кнопку,...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru