Форум программистов, компьютерный форум, киберфорум
Наши страницы

Assembler для начинающих

Войти
Регистрация
Восстановить пароль
 
bobah_wb
0 / 0 / 0
Регистрация: 26.04.2016
Сообщений: 1
#1

Почему при вызове функции 4ch прерывания 21h резидентный обработчик падает? - Assembler

26.04.2016, 18:27. Просмотров 206. Ответов 1

Написал резидентную программу, всё работает, но если моя или другие программы вызывают функцию 4ch прерывания 21h, консоль перестаёт реагировать на нажатия, хотя курсор мигает. Мне нужно вызывать эту функцию для выхода из копии программы при повторном запуске. Также, если после загрузки вызываю программу mem, то консоль перестаёт реагировать на нажатия, хотя курсор мигает. Скорее всего это связано с заменой вектора прерываний, но вот что именно не так, поянять не могу. Буду благодарен за помощь.
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
code segment
  old_int09 dd 0
  old_int2Fh dd 0
  message1 db "Programm already runs", 10, '$'
  message2 db "Programm unloaded", 10, '$'
  assume cs: code
  jmp start
 
  new_int2Fh  proc  far
    cmp ax,0FF00h
    jz installed
    jmp dword ptr cs:old_int2Fh
    installed:
    mov ax,00FFh
    iret
  new_int2Fh  endp
 
  new_int09h proc
    pushf
    call old_int09
    pushf
    push ax
    push dx
    push bx
    push cx
    push si
 
    mov ah, 01h
    int 16h
    cmp al, 24
    je write_data
    cmp al, 19
    je unload
    jmp return
 
    write_data:
    push 0f000h
    pop ds
    mov ah, 02h
    mov bx, 0e00eh
    mov cx, 103
    mov si, 0
    write_hex:
    cmp byte ptr [bx][si], 0
    je continue1
    mov dl, [bx][si]
    call write_byte
    continue1:
    inc si
    loop write_hex
    call new_line
    call new_line
    mov cx, 103
    mov si, 0
    write:
    cmp byte ptr [bx][si], 0
    je continue2
    mov dl, [bx][si]
    int 21h
    continue2:
    inc si
    loop write
    call new_line
    mov ah, 00h
    int 16h
    jmp return
 
    unload:
    mov ah, 00h
    int 16h
    mov ax, 2509h
    mov dx, word ptr old_int09
    mov ds, word ptr old_int09+2
    int 21h
    mov ax, 252fh
    mov dx, word ptr old_int2Fh
    mov ds, word ptr old_int2Fh+2
    int 21h
    mov ah, 09h
    push cs
    pop ds
    mov dx, offset message2
    int 21h
    mov ax, 04c00h
    int 21h
    return:
    pop si
    pop cx
    pop bx
    pop dx
    pop ax
    popf
    iret
    new_int09h endp
start:
  main proc far
    mov ax, 0FF00h
    int 2Fh
    cmp ax, 00FFh
    jne first_start
    mov ah, 09h
    push cs
    pop ds
    mov dx, offset message1
    int 21h
    mov ax, 4c00h
    int 21h
 
    first_start:
    push cs
    pop ds
    mov ax, 3509h
    int 21h
    mov word ptr old_int09, bx
    mov word ptr old_int09+2, es
    mov ax, 2509h
    mov dx, offset new_int09h
    int 21h
    mov ax, 352fh
    int 21h
    mov word ptr old_int2Fh, bx
    mov word ptr old_int2Fh+2, es
    mov ax, 252fh
    mov dx, offset new_int2Fh
    int 21h
 
    mov dx, (start - new_int09h +0fh)/16
    mov ah, 31h
    int 21h
  main endp
 
write_byte proc
    push ax
    push cx
    push dx
    mov ah, 02h
    mov cx, 2
    mov dh, dl
    shr dh, 4
    and dl, 0fh
    xchg dl, dh
    push dx
    write_sign:
    cmp cx, 1
    jne second_sign
    pop dx
    shr dx, 8
    second_sign:
    cmp dl, 9
    jle number
    add dl, 7
    number:
    add dl, '0'
    int 21h
    loop write_sign
    mov dl, ' '
    int 21h
    pop dx
    pop cx
    pop ax
    ret
write_byte endp
 
new_line proc
    mov ah, 02h
    mov dl, 10
    int 21h
    ret
new_line endp
 
code ends
end start
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.04.2016, 18:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему при вызове функции 4ch прерывания 21h резидентный обработчик падает? (Assembler):

Создать резидентный обработчик прерывания - Assembler
Создать резидентный обработчик прерывания, который по нажатию комбинации клавиш (любой) создает файл, в который записывается изображение на...

4ch int 21h НЕ освобождает память - Assembler
Память резидента после выгрузки не освобождается! Я использовал int 21h с кодом 4ch. Потом посмотрел список болоков памяти. Они все...

Резидентная программа (обработка функции 9h прерывания 21h) - Assembler
Разбираю программу из калашникова. Должна менять выводимую строку и быть резиднетной. Некуоторое оказалось непонятным что автор написал....

Ввод\вывод способами 9й , 10й функции 21h прерывания - Assembler
Помогите решить задачу по асм... Задан текст, в котором есть хотя бы одна точка. Преобразовать текст, удалив из него все запятые,...

Вывод таблицы векторов прерывания не используя int 21H - Assembler
Нужно вывести на экран Ms DOs таблицу векторов прерывания НЕ используя int 21H! так что я предполагаю через int 10H.. уже неделю с этим...

Обработчик прерывания и перехват прерывания - Assembler
Доброе время суток, я чтиаю книгу Калашникова-Ассемблер и уже втрой день не могу понять почему обработчик не перехватывает прерывания и не...

1
tahir_
159 / 100 / 25
Регистрация: 18.05.2015
Сообщений: 474
26.04.2016, 22:33 #2
bobah_wb,
Assembler
1
    mov dx, word ptr old_int09
думаю где вы обращаетесь к данным, но при этом ds у вас в этот момент указывает не на сегмент данных,
сделайте
Assembler
1
    mov dx, word ptr cs:[old_int09]
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2016, 22:33
Привет! Вот еще темы с ответами:

Обработчик прерывания - Assembler
На языке ассемблер написать резидентную программу, которая бы обрабатывала прерывание по времени (timer) и при одном проходе выводила бы...

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

Обработчик прерывания(звук) - Assembler
Здравствуйте,у меня такое задание: разработать обработчик прерывания который при нажатии некоторой клавиши издаст звук.(мелодия) У меня...

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


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

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

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