Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
4 / 4 / 1
Регистрация: 22.02.2009
Сообщений: 35

Собственное прерывание

04.12.2010, 23:43. Показов 1742. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго всем времени.
Нужна помощь с работой по прерываниям. От программы требуется, что бы по нажатию клавиш 1 - 6 на экран выводились символы @ # $ % & * .
Сделать это надо с помощью созданного прерывания. Программу я написал, но работает она некорректно, как я понимаю, она даже до моего собственного прерывания не добирается. Прошу совета, помощи.
Заранее спасибо.
Вот текст программы:
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
.386
esc_key equ 01h
;@,#,$,%,&,*
;hex code for symbols
symbA equ 040h
symbR equ 023h
symbS equ 024h
symbP equ  025h
sand equ 026h
sstar equ 02ah
 
symb1 equ 02h
symb2 equ 03h
symb3 equ 04h
symb4 equ 05h
symb5 equ 06h
symb6 equ 07h
 
 
_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  'Then, 1 for @',10,13
        db  '2 for # and more...',10,13,'$'
_DATA ENDS
 
_TEXT    SEGMENT    para 'CODE' use16
ASSUME  CS:_TEXT,DS:_DATA,SS:_ST
 
int9ptr dw 2 dup (?)
 
setint9 PROC
mov ah,35h
mov al,9
int 21h
 
mov cs:int9ptr,bx
mov cs:int9ptr+2,es
 
mov dx,offset userint9
push ds
push cs 
pop ds
 
MOV AH,25H
MOV AL,9 
INT 21H 
pop ds
 
ret
setint9 ENDP
 
retint9 PROC
push ds
push dx
mov dx,cs:int9ptr
mov ax,cs:int9ptr+2
mov ds,ax
 
MOV AH,25H
MOV AL,9 
MOV AL,9 
pop dx
pop ds
 
ret
retint9 ENDP
 
 
userint9    proc    far
pushf
call    dword ptr cs:int9ptr
pushad
xor ax,ax
in  al,60h
mov ah,al
cmp ah,esc_key
je  short ui9020
call show 
 
jmp ui9040
;------
ui9020: 
call retint9
mov ax,4c00h
int 21h
;------
ui9040:
popad
iret                    
userint9    endp 
 
show    proc    near
@go:    
    mov ah,10h      
    int 16h
    
    xor dx,dx
    
    cmp al,symb1
    jne @1
    mov dl,symbA
    
@1: cmp al,symb2
    jne @2
    mov dl,symbR
    
@2: cmp al,symb3
    jne @3
    mov dl,symbS
    
@3: cmp al,symb4
    jne @4
    mov dl,symbP
    
@4: cmp al,symb5
    jne @5
    mov dl,sand
    
@5: cmp al,symb6
    jne @6
    mov dl,sstar
@6:
    cmp al,esc_key
    je @exit
    
    mov ah,02h      
    int 21h
    
    
    
    jmp @go
 
 @exit:
    ret
    show endp
    
;-------
begin:
mov ax,_data
mov ds,ax
 
mov ah,09h
mov dx,offset msg
int 21h
 
cli
call setint9
sti
 
 
cli
call retint9
sti 
 
 
 
 
mov ax,4c00h
int 21h
 
_TEXT ENDS
    end  begin
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.12.2010, 23:43
Ответы с готовыми решениями:

Написать собственное прерывание от клавиатуры
Здравствуйте уважаемые программисты!нужна помощь в выполнении задания "написать собственное прерывание от клавиатуры".в...

Собственное прерывание по нажатию клавиши.
Добрый вечер. Нужна программа для вывода счетчика по таймеру. Точнее это я уже сделал. Теперь надо что бы при нажатии ctrl+c (можно другую...

(COM) Хотелось бы понять, как заставить программу отобразить собственное содержимое
Здравствуйте. Сейчас учу ассемблер и первая проблема - > как без помощи Win32API написать программку, которая читает сама себя и...

4
4187 / 1835 / 220
Регистрация: 06.10.2010
Сообщений: 4,123
05.12.2010, 18:03
Вот черновой набросок. При выходе (клавиша escape) старый вектор прерывания не восстанавливается.
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
.model tiny
.code
.486
org 100h
start:
  mov ax,3
  int 10h
  
  mov eax,fs:[9*4]
  mov [oldint9],eax
  mov word ptr fs:[9*4],offset userint9
  mov fs:[9*4+2],cs
  
  mov dx,offset userint9
  int 21h
  
  userint9:
    pusha
    in    al,60h
    cmp   al,7
    ja exit
    push  0B800h
    pop   es
    sub   al,2
    jl quit
    movzx bx,al
    mov   di,cs:[_di]
    add   cs:[_di],2
    mov   al,cs:[symbols+bx]
    mov   es:[di],al
    exit:
    popa
  jmp cs:[oldint9]
  
  quit:
  int 20h   
  
  _di     dw 0
  symbols db '@#$%&*'
  oldint9 dd 0
   
end     start
1
4 / 4 / 1
Регистрация: 22.02.2009
Сообщений: 35
05.12.2010, 21:30  [ТС]
Ух, это достаточно сложновато для меня.)
Если старый вектор не заменяется, то Вашим кодом мне нужно заменить у себя процедуру "retint9"?
Не могли бы, если не сложно, немного объяснить что к чему?
И по какой причине у меня вектор не восстанавливается?
Заранее благодарен.
0
4187 / 1835 / 220
Регистрация: 06.10.2010
Сообщений: 4,123
06.12.2010, 17:18
Немного подправил код.

При старте fs равен 0.
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
.model tiny
.code
.486
org 100h
start:
  mov ax,3          
  int 10h                    ;устанавливаем текстовый режим
  
  mov eax,fs:[9*4]                      ;сохраняем старый обработчик прерывания
  mov [oldint9],eax                     ;клавиатуры в переменную oldint9
  mov word ptr fs:[9*4],offset userint9 ;устанавливаем свой обработчик
  mov fs:[9*4+2],cs
  
  a: jmp a
  
  userint9:
    pusha
    in    al,60h             ;считываем сканкод
    cmp   al,7               ;если сканкод больше 6
    ja exit                  ;передаём управление старому обработчику
    sub   al,2               ;если сканкод меньше 2 (клавиша escape)
    jl quit                  ;то завершаем программу
    push  0B800h    
    pop   es                 ;es - сегмент видеопамяти
    movzx bx,al              
    mov   di,cs:[_di]        ;di - смещение текущего символа на экране
    add   cs:[_di],2         
    mov   al,cs:[symbols+bx] ;преобразуем сканкод по таблице перекодировки
    mov   es:[di],al         ;выводим символ на экран
    exit:
    popa
  jmp cs:[oldint9] ;передаём управление старому обработчику
  
  quit:
  int 20h   
  
  _di     dw 0        ;указатель на текущий символ (позиция курсора)
  symbols db '@#$%&*' ;таблица перекодировки
  oldint9 dd 0        ;указатель на старый обработчик прерывания клавиатуры
   
end     start
И по какой причине у меня вектор не восстанавливается?
Это в моём примере не восстанавливается. В принципе это и не нужно если запускаешь из Windows.
1
4 / 4 / 1
Регистрация: 22.02.2009
Сообщений: 35
08.12.2010, 20:46  [ТС]
Спасибо, уже разобрался. Сел и переписал прогу с 0. Конечно не так хорошо сделана, как у Вас, но за то сам сделал. А на счет возврата - то так по заданию нужно, но я вроде справился.
В общем, спасибо за потраченное время и внимание.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.12.2010, 20:46
Помогаю со студенческими работами здесь

Прерывание
после запуска программы(изменение системной даты и времени) после того как я ввожу новые значения для даты, времени итд, мне эмулятор...

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

Прерывание 20h
Здравствуйте, господа! Я случайно наткнулся на этот форум, и мне здесь понравилось, особенно по сравнению с остальными) Собственно, у...

Вывести на экран скан-код клавиши
Я создал программу вывода на экран веке кода клавиши. С помощью int 16h .но за into 16h скрывается много функций. Каким образом происходит...

Прерывание клавиатуры
нужна помощь. есть задание: Поставить в соответствие десятичным цифрам (0 - 9) азбуку, подобную азбуке Морзе (см. таблицу ниже)....


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru