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

Ошибка при выгрузке резидентной программы (exe)

09.04.2015, 00:41. Показов 898. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Есть такая задача. Нужно загрузить резидента (именно EXE) в память а потом выгрузить и вроде бы мой код работает хорошо, да не очень. После того, как я установлю прерывание обратно, я пытаюсь стереть окружение программы а потом саму программу с помощью int 21h функции 49h. Но появляется следующая ошибка если я попытаюсь закрыть консоль нажав на крестик в верхнем правом углу окна:
а вот мой код:
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
262
263
264
265
ASTACK segment stack
    dw 100h dup(?)
    mark_END_OF_STACK = $
    ASTACK ends
 
    ACODE segment
    assume CS: ACODE, DS: ACODE, SS: ASTACK
 
    str_MOD db 'StdMod$'        ;\  Residential data (ResMod - if residential program, StdMod - if not residential program) 
    val_COUNTER db 0            ; | 
    val_RES_PSP_ADDR dw 0       ; | PSP address of residential programm
    val_OLD_INT_PROC_ADDR dd 0  ;/  Old int 1Ch address
 
    NEW_INT_PROC proc far
            push DS ;Saving registers
                push AX
 
                push CS
                pop DS
 
                cmp val_COUNTER, 10
                je CLEAR_COUNTER
                mov AL, val_COUNTER
                add AL, '0'
                inc val_COUNTER
                call DIRECT_PRINT
                jmp EXIT_RES
 
            CLEAR_COUNTER:
                mov val_COUNTER, 0
 
            EXIT_RES:
                pop AX ;Recovering registers
            pop DS
 
            mov AL, 20h
            out 20h, AL
            iret
    NEW_INT_PROC endp
 
    DIRECT_PRINT proc near
        push AX
        push BX
        push CX
        push DX
        push SP
        push BP
        push SI
        push DI
        ;Getting current cursor position
        mov AH, 03h
        mov BH, 00h
        int 10h
        push DX;Saving current row and collumn of cursor position
        ;Settin new cursor position
        mov AH, 02h
        mov BH, 00h
        mov DX, 0000h
        int 10h
        ;Print number from AL
        mov AH, 09h
        mov BH, 0
        ;mov BL, 153
        mov CX, 1
        int 10h
        ;Recovering cursor position
        mov AH, 02h
        mov BH, 00h
        pop DX;Recoveing initial cursor position
        int 10h
        pop DI
        pop SI
        pop BP
        pop SP
        pop DX
        pop CX
        pop BX
        pop AX
        ret
    DIRECT_PRINT endp
 
    mark_NEW_INT_PROC_MEM = $
 
    PRNT_MARKED_STRING proc near
        ;Print string with end of string mark
        ;String offset must be in DX
        push AX
        mov AH, 09h
        int 21h
        pop AX
        ret
    PRNT_MARKED_STRING endp
 
    LOAD_RESIDENT proc near
        push AX
        push BX
        push DX
 
        mov [str_MOD], 'R'
        mov [str_MOD + 1], 'e'
        mov [str_MOD + 2], 's'
        mov [val_RES_PSP_ADDR], ES              ;Save PSP address to realise memory later
        
        push ES
        mov AX, 351Ch                       ;Getting CS:IP of standart interruption procedure
        int 21h                             
        mov word ptr [val_OLD_INT_PROC_ADDR], BX    ;IP of standart interruption procedure saved 
        mov word ptr [val_OLD_INT_PROC_ADDR + 2], ES ;CS of standart interruption procedure saved
        pop ES
 
        push DS                             
        mov DX, offset NEW_INT_PROC     ;Installing new interruption on 1Ch
        mov AX, seg NEW_INT_PROC
        mov DS, AX
        mov AX, 251Ch
        int 21h
        pop DS 
 
        pop DX
        pop BX
        pop AX
 
        ret
    LOAD_RESIDENT endp
 
    FREE_RESIDENT proc near
        push AX
        push BX
        push DX 
 
        push ES
        mov AX, 351Ch
        int 21h
        mov AX, word ptr ES:[val_OLD_INT_PROC_ADDR]
        mov word ptr [val_OLD_INT_PROC_ADDR], AX
        mov BX, word ptr ES:[val_OLD_INT_PROC_ADDR + 2]
        mov word ptr [val_OLD_INT_PROC_ADDR + 2], BX
        mov BX, ES:[val_RES_PSP_ADDR]
        mov [val_RES_PSP_ADDR], BX ;Get residential PSP address
        pop ES
 
        cli                                 ;Recovering standart interruption
        push DS 
        mov DX, word ptr [val_OLD_INT_PROC_ADDR]
        mov AX, word ptr [val_OLD_INT_PROC_ADDR + 2]
        mov DS, AX
        mov AX, 251Ch
        int 21h
        pop DS 
        sti
 
        mov AH, 49h
        push ES
        mov ES, [val_RES_PSP_ADDR]
        push ES
        mov ES, ES:2Ch
        int 21h
        pop ES
        int 21h
        pop ES
 
        pop DX
        pop BX
        pop AX
        ret
    FREE_RESIDENT endp
 
    IS_RES_RUNNING proc near
            push ES
            push AX
 
            mov AX, 351Ch
            int 21h
            cmp ES:[str_MOD], 'R'
            jne EXIT_RES_NOT_RUNNING
            cmp ES:[str_MOD+1], 'e'
            jne EXIT_RES_NOT_RUNNING
            cmp ES:[str_MOD+2], 's'
            jne EXIT_RES_NOT_RUNNING
            cmp ES:[str_MOD+3], 'M'
            jne EXIT_RES_NOT_RUNNING
            cmp ES:[str_MOD+4], 'o'
            jne EXIT_RES_NOT_RUNNING
            cmp ES:[str_MOD+5], 'd'
            jne EXIT_RES_NOT_RUNNING
            mov DS:[val_RES_RUNNING], 1
 
        EXIT_RES_NOT_RUNNING:
            pop AX
            pop ES
            ret
    IS_RES_RUNNING endp
 
    USER_UNLOAD proc near
            push ES
            push AX
 
            mov ES, [val_RES_PSP_ADDR]
            cmp byte ptr ES:[80h], 04h
            jne EXIT_USR_INLOAD
            cmp byte ptr ES:[82h], '/'
            jne EXIT_USR_INLOAD
            cmp byte ptr ES:[83h], 'u'
            jne EXIT_USR_INLOAD
            cmp byte ptr ES:[84h], 'n'
            jne EXIT_USR_INLOAD
            mov [val_RES_USR_UNLOAD], 1
 
        EXIT_USR_INLOAD:
            pop AX
            pop ES
            ret
    USER_UNLOAD endp
 
    str_RES_LOADED db 'Residential program has been loaded', 10, 13, '$'
    str_RES_RUNNING db 'Residential program is running', 10, 13, '$'
    str_RES_NOT_RUNNING db 'Residential program is not running', 10, 13, '$'
    str_RES_UNLOADED db 'Residential program has been unloaded', 10, 13, '$'
    val_RES_RUNNING db 0
    val_RES_USR_UNLOAD db 0
 
    MAIN proc far 
            push DS
            push AX
 
            mov AX, ACODE
            mov DS, AX
            
            mov [val_RES_PSP_ADDR], ES ;Saving PSP address
 
            call IS_RES_RUNNING
            cmp val_RES_RUNNING, 1
            je FREE_RESIDENT_PROG
 
            mov DX, offset str_RES_NOT_RUNNING
            call PRNT_MARKED_STRING
            mov DX, offset str_RES_LOADED
            call PRNT_MARKED_STRING
 
            call LOAD_RESIDENT
            mov DX, offset mark_NEW_INT_PROC_MEM
            add DX, offset mark_END_OF_STACK
            add DX, 10Fh
            mov CL, 4
            shr DX, CL
            mov AX, 3100h
            int 21h
        FREE_RESIDENT_PROG:
            mov DX, offset str_RES_RUNNING
            call PRNT_MARKED_STRING
 
            call USER_UNLOAD
            cmp [val_RES_USR_UNLOAD], 1
            jne EXIT
 
            mov DX, offset str_RES_UNLOADED
            call PRNT_MARKED_STRING
 
            call FREE_RESIDENT
        EXIT:
            mov AX, 4C00h
            int 21h
    MAIN endp
    ACODE ends
    end MAIN
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.04.2015, 00:41
Ответы с готовыми решениями:

Виртуальная машина зависает при загрузке резидентной программы
создал 2 файла test.asm тестирующая и code.asm резидентная программа. при загрузке резидентной программы виртуальная машина зависает не...

Фрагмент резидентной программы
Здравствуйте, не могли бы вы помочь с заданием? Нужно написать фрагмент резидентной программы на языке Ассемблер MASM 86, сохраняющий в...

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.04.2015, 00:41
Помогаю со студенческими работами здесь

Выгрузка резидентной программы
помогите написать выгрузку программы(код представлен), обычные часы.. надо сделать чтоб или от клавиши или от повторного запуска файла она...

Фрагмент резидентной программы
Прошу помочь с решением задания Написать фрагмент резидентной программы на языке Ассемблер MASM 86, сохраняющей в памяти фрагмент...

Защита резидентной программы от повторной установки
Есть две программы резидентная и обращающаяся к ней. Что надо добавить чтобы защитить резидентную от повторной установки в память? ...

Выход из резидентной программы или выгрузка ее из памяти
Я уже сюда не раз писал насчет резидентной программы. Многие помогли) Большое все спасибо) У меня есть программа, загружаемая...

УТ 10.3 ошибка при выгрузке
Привет. Ут 10.3 конфа много раз изменялась и все было норм, но сейчас непонятная проблема: запускаю штатный обмен с розницей и ошибка....


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Камера 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, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru