0 / 0 / 0
Регистрация: 02.11.2011
Сообщений: 29
1

Не могу сделать программу резидентной :(

06.12.2013, 20:17. Показов 987. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Мучаюсь уже 2 дня... Никак не могу сделать программу резидентной. Мне нужно осуществить перехват int09h, которое анализирует нажатие alt+a.
Далее происходит слияние файлов и расчет выражения, это я сделал.

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
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
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
model small
 
DATA SEGMENT
mes11 db 'PRIMER1.TXT',0
mes22 db 'PRIMER2.TXT',0
HANDL1 DW ?
HANDL2 DW ?
BUFER DB 1000 DUP(?)
EOF DB 0
 
mes db 0Dh,0Ah,'Raschet vyrazhenya: y=((z+x)-(x*2))*2', 0Dh, 0Ah, '$'
mes1 db 0Dh,0Ah,'Vvedite x(0-9)=','$'
mes2 db 0Dh,0Ah,'Vvedite z(0-9)=','$'
mes3 db 0Dh,0Ah,'Reshenie:','$'
mes4 db 0Dh,0Ah,'(z+x)=','$'
mes5 db 0Dh,0Ah,'(x*2)=','$'
mes6 db 0Dh,0Ah,'(z+x)-(x*2)=','$'
mes7 db 0Dh,0Ah,'Otvet: y=','$'
mes8 db 0Dh,0Ah,'$'
mes9 db 0Dh,0Ah,'Nazhmite kombinaciy klavish ALT+A...','$'
mes10 db 0Dh,0Ah,'Fail #1 otkryt?','$'
mes13 db 0Dh,0Ah,'Da','$'
mes14 db 0Dh,0Ah,'Fail #2 otkryt?','$'
mes15 db 0Dh,0Ah,'Da','$'
mes16 db 0Dh,0Ah,'Kopirovanie...','$'
mes17 db 0Dh,0Ah,'Kopirovanie zaversheno...','$'
mes18 db 0Dh,0Ah,'Proishodit zakrytie failov', 0Dh, 0Ah, 0Dh, 0Ah,'$'
mes20 db 0Dh,0Ah,'Nazhmite ESC dlya vyhoda...','$'
DATA ENDS
 
SSEG SEGMENT STACK
DB 200 DUP(?)
SSEG ENDS
 
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ss:SSEG
 
start:
 
mov ax,DATA
mov ds,ax
 
mov ah,00h      
mov al,03h
int 10h
 
 
 
a1: mov ah,9 
    mov dx,offset mes9 
    int 21h
    mov ah, 0
        int 16h
    cmp ah,1eh  ; Проверка нажатия Alt+a
    jnz a1
 
 
mov ah,00h      
mov al,03h
int 10h
 
    mov ah,9 
    mov dx,offset mes10 
    int 21h
 
mov ah,3dh  ;открываем 1-ый файл
mov al,0
lea dx,mes11
int 21h
jnz OTKR
jc CLOSE2
mov HANDL1,ax
 
OTKR:   mov ah,9 
    mov dx,offset mes13 
    int 21h
    
 
    mov ah,9 
    mov dx,offset mes14 
    int 21h
 
mov ah,3dh  ;открываем 2-ый файл
mov al,1
lea dx,mes22
int 21h
jnz OTKR2
jc CLOSE1
mov HANDL2,ax
 
OTKR2:  mov ah,9 
    mov dx,offset mes15 
    int 21h
 
mov ah,42h  ;указатель второго файла на конец
mov bx,HANDL2
xor cx,cx
xor dx,dx
mov al,2
int 21h
 
lea dx,BUFER    ;готовим регистры
mov cx,1000
 
;БЛОК КОПИРОВАНИЯ
 
    mov ah,9 
    mov dx,offset mes16 
    int 21h
 
LOO:    mov bx,HANDL1   ;читаем
    mov ah,3fh
    int 21h
    cmp ax,cx
    jz NORM
    mov cx,ax   ;<1000байт
    mov EOF,1   ;достигнут конец файла
 
NORM:   mov bx,HANDL2   ;пишем
    mov ah,40h
    int 21h
    cmp EOF,0   ;не достигнут ли конец
    jz LOO
 
    mov ah,9 
    mov dx,offset mes18 
    int 21h
 
CLOSE2: mov ah,3eh  ;закрываем второй файл
    mov bx,HANDL2
    int 21h
 
CLOSE1: mov ah,3eh  ;закрываем ПЕРВЫЙ файл
    mov bx,HANDL1
    int 21h
 
xor cx,dx
xor ax,bx
 
 
mov ah,09h  ; DOS функция вывода строки на экран
mov dx,offset mes   ; Задаём смещение к началу строки
int 21h     ; Выводим строку
;////////////////////
mov ah, 09h
mov dx, offset mes1
int 21h
 
mov ah,01h      ;считали с клавиатуры x
int 21h
sub al,'0'
 
push ax         ;занесли в стэк x
 
mov ah, 09h
mov dx, offset mes2
int 21h
 
mov ah,01h      ;считали с клавиатуры z
int 21h
sub al,'0'
 
mov bl,al   ;z перенесли в bl
 
mov ah, 09h
mov dx, offset mes8
int 21h
 
mov ah, 09h
mov dx, offset mes3
int 21h
 
mov ah, 09h
mov dx, offset mes8
int 21h
;////////////////////z+x
pop ax          ;извлекли из стэка x
mov cl,al       ;x перенесли в cl
add bl,cl       
 
push bx
 
mov ah,09h
mov dx,offset mes4
int 21h
 
mov dl,bl       
add dl,'0'      
mov ah,02h
int 21h
;////////////////////x*2
mov al,2
mul cl
mov cl,al
 
push cx
mov dl,cl
mov ah,09h
mov dx,offset mes5
int 21h
 
mov dl,cl
add dl,'0'
mov ah,02h 
int 21h
;////////////////////(z+x)-(x*2)
pop bx      ;(x*2)
pop ax      ;(z+x)
sub al,bl 
push ax  
mov cl,al
 
mov ah,09h
mov dx,offset mes6
int 21h
 
mov dl,cl
add dl,'0'
mov ah,02h
int 21h
;////////////////////((z+x)-(x*2))*2
pop ax
mov bl,al
mov al,2
mul bl
mov cl,al
 
push cx
 
mov ah, 09h
mov dx, offset mes8
int 21h
 
mov ah,09h
mov dx,offset mes7
int 21h
 
pop ax
 
push -1               
        mov cx,10
      L:mov dx,0
        div cx
        push dx
        cmp ax,0
        jne L
        mov ah,2h
        L2: pop dx
        cmp dx,-1
        je ex
        add dl,'0'
        int 21h
        jmp L2
        ex: mov ax,4c00h
        int 21h
 
 
EXIT:   mov ah,4ch
    int 21h
    CODE ENDS
END start
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.12.2013, 20:17
Ответы с готовыми решениями:

Как сделать программу резидентной
Есть работающий код программы. Выводит сообщение на экран. Но необходимо во первых: чтобы после...

Сделать программу резидентной
Всем доброго времени суток. Кто может помочь в програмкой? В общем не пойму что нужно прописать...

Сделать приведенную программу резидентной (FASM)
Всем доброго времени суток! Нужно сделать программу резидентной. Помогите кто чем сможет. use16 ;...

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

9
0 / 0 / 0
Регистрация: 02.11.2011
Сообщений: 29
14.12.2013, 22:09  [ТС] 2
Спасибо вам люди добрые... Программисты...
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
14.12.2013, 22:47 3
Посмотрите код в этой теме: Re: Составить резидентную программу

TSR, обычно, проще делать из COM (т.е. модель памяти TINY).
1
0 / 0 / 0
Регистрация: 02.11.2011
Сообщений: 29
14.12.2013, 22:50  [ТС] 4
Цитата Сообщение от gazlan Посмотреть сообщение
Посмотрите код в этой теме: Re: Составить резидентную программу

TSR, обычно, проще делать из COM (т.е. модель памяти TINY).
я пишу на Assembler. Что только не перепробовал, у меня DOSbox виснет...
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
14.12.2013, 23:52 5
В DOS 6.x (и даже Win'9x) это работало. Про DOSBox ничего не знаю. Вполне возможно, что он не способен эмулировать TSR, ибо TSR работает не в DOS, а параллельно с ним.

Когда Borland выпустила свой Sidekick, это выглядело большим чудом, чем высадка на Луне :-)
1
67 / 3 / 1
Регистрация: 02.12.2013
Сообщений: 17
17.12.2013, 14:19 6
Косtян, а в каком эмуляторе пишешь?
0
0 / 0 / 0
Регистрация: 02.11.2011
Сообщений: 29
19.12.2013, 21:03  [ТС] 7
Цитата Сообщение от homochka Посмотреть сообщение
Косtян, а в каком эмуляторе пишешь?
В общем у меня DOSbox 0.74 и компилирую все через tasm и tlink))

Добавлено через 9 минут
Цитата Сообщение от gazlan Посмотреть сообщение
В DOS 6.x (и даже Win'9x) это работало. Про DOSBox ничего не знаю. Вполне возможно, что он не способен эмулировать TSR, ибо TSR работает не в DOS, а параллельно с ним.

Когда Borland выпустила свой Sidekick, это выглядело большим чудом, чем высадка на Луне :-)

Может все дело в DOSbox? У меня win7 x64 стоит, где можно взять dos для него? не могу найти что-то...

Добавлено через 23 часа 40 минут
в общем я сделал резидентную программу... Но она у меня все равно зависает... Помогите пожалуйста (здесь происходит слияние двух файлов в текущей директории)

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
.model tiny
.code
.286c
org 1eh
envseg dw ?
org 100h
 
start:
    jmp init
 
int09h_handler proc far
    jmp short actual_int09h_handler
old_int09h  dd ?
        dw 424Bh
        db 00h
actual_int09h_handler:
    pushf
    call dword ptr cs:old_int09h
disable_point label byte
    pusha
    push ds
    push es
    cld
    push 0B800h
    pop es
    push 0040h
    pop ds
    mov di, word ptr ds:001Ch
    cmp di, word ptr ds:001ch
    jne l1
        jmp exit
        l1:
 
mov ax, word ptr [di]
 
No_ext:
    mov ah,10h  ;ожидание нажатия клавиши от пользователя
    int 16h     ;(в ah=0, если расширенный, в al=расширенный код)
    cmp al,0    ;проверка на расширенный код
    jnz No_ext  ;если не расширенный код, то переход к No_ext
    cmp ah,1eh  ;расширенный код Alt+a(в ah );
push cs
pop ds
    je Alt_a    ;если да(Alt+a), то переход к Alt_a:
    jne exit    ;иначе на старый вектор
 
Alt_a proc near
 
    ;открываем первый файл
    MOV AH,3DH
    MOV AL,0
    LEA DX,PATH1
    INT 21H
    JC EXIT1
    MOV HANDL1,AX
;открываем второй файл
    MOV AH,3DH
    MOV AL,1
    LEA DX,PATH2
    INT 21H
    JC CLOSE1
    MOV HANDL2,AX
;указатель второго файла на конец
    MOV AH,42H
    MOV BX,HANDL2
    XOR CX,CX
    XOR DX,DX
    MOV AL,2
    INT 21H
;готовим регистры
   LEA DX,BUFER
   MOV CX,1000
;блок копирования
LOO: 
;читаем 
   MOV BX,HANDL1
   MOV AH,3FH
   INT 21H
   CMP AX,CX
   JZ NORM
   MOV CX,AX ;<1000 байт
   MOV  EOF,1 ;достигнут конец файла
  NORM:
;пишем
  MOV BX,HANDL2
  MOV AH,40H
  INT 21H
  CMP EOF,0 ; не достигнут ли конец
  JZ LOO
 ; закрываем второй файл 
CLOSE2:
   MOV AH,3EH
   MOV BX,HANDL2
   INT 21H
 ;закрываем первый файл
CLOSE1:
   MOV AH,3EH
   MOV BX,HANDL1
   INT 21H
    ;выход в ДОС
EXIT1:
  MOV AH,4CH
  INT 21H
 
Alt_a endp
 
int09h_handler endp
 
exit:
    pop es
    pop ds
    popa    
    iret
    
init proc near
 
    mov ax,3509h; получим адрес обработчика прерывания 
    int 21h
    mov word ptr old_int09h,bx
    mov word ptr old_int09h+2,es
 
    mov ax,2509h; установим адрес нового обработчика
    mov dx, offset int09h_handler
    int 21h
 
    mov ah,49h
    mov es, word ptr envseg
    int 21h
 
    mov dx, offset init
 
    int 27h 
ret
 
str1 db 'OPEN ERROR! ','$'
path db "mm.txt",0 ; имя файла для октрытия
buf  db 1 dup (?)
PATH1 DB 'PRIMER1.TXT',0;имя первого файла
PATH2 DB 'PRIMER2.TXT',0;имя второго файла(куда добавлять)
HANDL1 DW ?             ;описатель первого файла  
HANDL2 DW ?             ;описатель второго файла
BUFER  DB 1000 DUP(?)   ;буфер
EOF DB 0                ;если 1,то в процессе чтения 
            ;достигнут конец файла
init endp
end start
0
0 / 0 / 0
Регистрация: 02.11.2011
Сообщений: 29
20.12.2013, 21:04  [ТС] 8
ЛЮЮЮЮЮДИИИИИ
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
20.12.2013, 22:00 9
Цитата Сообщение от Косtян Посмотреть сообщение
ЛЮЮЮЮЮДИИИИИ
Гм. Не по теме: зачем вам TSR? Где вы возьмете DOS и что будете с ним делать? Пишите под актуальную OS, проще будет и с отладкой и с комьюнити.
1
0 / 0 / 0
Регистрация: 02.11.2011
Сообщений: 29
22.12.2013, 16:08  [ТС] 10
Цитата Сообщение от gazlan Посмотреть сообщение
Гм. Не по теме: зачем вам TSR? Где вы возьмете DOS и что будете с ним делать? Пишите под актуальную OS, проще будет и с отладкой и с комьюнити.
Все помучился я и сделал) Только теперь осталось произвести выгрузку резидента)
0
22.12.2013, 16:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.12.2013, 16:08
Помогаю со студенческими работами здесь

Не могу сделать программу!
Хочю сделать программу,чтобы в массиве были имена и даты.И программа спрашивала дату.После ввода...

Не могу сделать тривиальную программу на борланде.
program lesson1; {здесь описывается заголовок программы} var a,b:integer; {переменные в которые...

не могу сделать программу с указателями на массив и с функцией
такая &quot;беда&quot; впервые столкнулся с указателями,в них чайник.. вот код задание--вывести...

Я не могу сделать программу полностью в Delphi Borland 7
Я не могу сделать программу полностью в Delphi Borland 7


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru