Listing (КП - резидентный загрузчик), страница 2
Описание файла
Файл "Listing" внутри архива находится в следующих папках: КП - резидентный загрузчик, Резидентный загрузчик. Текстовый-файл из архива "КП - резидентный загрузчик", который расположен в категории "". Всё это находится в предмете "системное программирование" из 5 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "системное программирование" в общих файлах.
Просмотр 2 страницы текстового-файла онлайн
216 0164 8B 3E001A mov di,word ptr ds:[1Ah] ;загрузка адреса головы
217 0168 3B 3E001C cmp di,word ptr ds:[1Ch] ;и хвоста буфера клавиатуры, если +
218 они равны, то прерывание
219 016C 0F 8400FB je exit_09h_handler ;вызвано отпусканием +
220 клавиш. Значитнам тутне место :)
221
222 0170 8B 05 mov ax,word ptr [di] ;Читает символиз головы +
223 буфера.
224 ;Дальше +
225 проверяет скан-коды
226 0172 80 FC02 cmp ah,02h ;1 or !
227 0175 74 3690 90 je work_1 ;да это 1. Идет на +
228 работу
Turbo Assembler Version 3.1 26/12/02 04:09:58 Page 5
loader.ASM
229 0179 80 FC03 cmp ah,03h ;2 or @
230 017C 74 5590 90 je work_2 ;аналогично
231 0180 80 FC16 cmp ah,16h ;u or U
232 0183 74 0C90 90 je its_u
233 0187 80 FC2E cmp ah,2eh ;с or C
234 018A 74 1390 90 je its_c
235 018E E9 00DA jmp exit_09h_handler ;если мы попали сюда, то +
236 символне относился к группе 1, 2, u, c
237
238 0191 its_u:
239 0191 A0 0017 mov al,ds:[17h]
240 0194 B4 04 mov ah,04h
241 0196 84 E0 test ah,al ;проверка нажата ли клавиша+
242 Ctrl
243 0198 75 7190 90 jnz work_u
244 019C E9 00CC jmp exit_09h_handler
245
246 019F its_c:
247 019F A0 0017 mov al,ds:[17h]
248 01A2 B4 04 mov ah,04h
249 01A4 84 E0 test ah,al ;проверка нажата ли клавиша+
250 Ctrl
251 01A6 0F 8500B3 jnz work_c
252 01AA E9 00BE jmp exit_09h_handler
253
254
255 01AD work_1:
256 01AD 89 3E001C mov word ptr ds:[1Ch],di
257
258 01B1 FA cli
259
260 01B2 33 C0 xor ax,ax
261 01B4 2E: 38 06 0560r cmp byte ptr cs:is_haveto_work,al
262 01B9 75 3C90 90 jne drop_cli ;проверки +
263 возможности вызова функции загрузки
264
265 01BD 2E: 38 06 055Fr cmp byte ptr cs:is_app_working,al
266 01C2 75 3390 90 jne drop_cli
267
268 01C6 2E: A3 0561r mov word ptr cs:which_app,ax;указывает какой файл запускать
269
270 01CA B0 01 mov al,1
271 01CC 2E: A2 0560r mov byte ptr cs:is_haveto_work,al
272 01D0 EB 2590 jmp drop_cli
273
274 01D3 work_2:
275 01D3 89 3E001C mov word ptr ds:[1Ch],di
276
277 01D7 FA cli
278
279 01D8 33 C0 xor ax,ax
280 01DA 2E: 38 06 0560r cmp byte ptr cs:is_haveto_work,al
281 01DF 75 1690 90 jne drop_cli
282
283 01E3 2E: 38 06 055Fr cmp byte ptr cs:is_app_working,al
284 01E8 75 0D90 90 jne drop_cli
285
Turbo Assembler Version 3.1 26/12/02 04:09:58 Page 6
loader.ASM
286 01EC B8 0001 mov ax,1
287 01EF 2E: A3 0561r mov word ptr cs:which_app,ax
288 01F3 2E: A2 0560r mov byte ptr cs:is_haveto_work,al
289
290 01F7 drop_cli: ;сбросзапрета +
291 прерываний и выход из обработчика
292 01F7 FB sti
293 01F8 EB 7190 jmp exit_09h_handler
294
295 01FB unld_err:
296 01FB 8C C8 mov ax,cs ;выводит сообщения +
297 об невозможности выгрузки
298 01FD 8E D8 mov ds,ax
299 01FF BA 04B7r lea dx,msg_unld_err
300 0202 B9 0026 mov cx,offset msg_unld_err_len
301 0205 E8 FF35 call pmsg
302
303 0208 EB 6190 jmp exit_09h_handler
304
305 020B work_u:
306 020B 89 3E001C mov word ptr ds:[1Ch],di ;очищает буферклавиатуры, +
307 устанавливая адреса головы
308 ;и хвоста +
309 одинаковыми, уничтожаясимвол в буфере
310 020F FA cli ;запрещает +
311 все прерываниякроме немаскируемых, т.к. выполняет
312 +
313 ;критический участок
314 0210 6A 00 push 0
315 0212 1F pop ds ;в ds +
316 сегментный адрес таблицы векторов прерываний
317 0213 8C C8 mov ax,cs ;в ax наш +
318 сегментный адрес
319
320 0215 3B 060026 cmp ax,word ptr ds:[09h*4+2];сравнивает сегментныеадреса,т.к.+
321 DOS незагрузит другую
322 ;программу +
323 с сегментным адресом резидента
324 0219 75 E0 jne unld_err
325 021B 3B 0600A2 cmp ax,word ptr ds:[28h*4+2]
326 021F 75 DA jne unld_err
327 0221 3B 0600B6 cmp ax,word ptr ds:[2Dh*4+2]
328 0225 75 D4 jne unld_err
329
330 0227 B8 2509 mov ax,2509h ;восстанавливает +
331 старыеобработчики
332 022A 2E: C5 16 0148r lds dx,dword ptr cs:old_int09h ;принцип см. вразделе +
333 инициализации
334 022F CD 21 int 21h
335 0231 B8 2528 mov ax,2528h
336 0234 2E: C5 16 0271r lds dx,dword ptr cs:old_int28h
337 0239 CD 21 int 21h
338 023B B8 252D mov ax,252Dh
339 023E 2E: C5 16 03E1r lds dx,dword ptr cs:old_int2Dh
340 0243 CD 21 int 21h
341
342 0245 8C C8 mov ax,cs ;выводит сообщение +
Turbo Assembler Version 3.1 26/12/02 04:09:58 Page 7
loader.ASM
343 об успешной выгрузке
344 0247 8E D8 mov ds,ax
345 0249 BA 048Ar lea dx,msg_unld
346 024C B9 002D mov cx,offset msg_unld_len
347 024F E8 FEEB call pmsg
348
349 0252 0E push cs
350 0253 5B pop bx ;bx +
351 содержит сегментный адрес резидента
352 0254 B4 50 mov ah,50h ;объявляет резидент+
353 текущим процессом
354 0256 CD 21 int 21h
355 0258 B8 4C00 mov ax,4C00h ;и завершает его, +
356 код возврата 00 - успешная выгрузка
357 025B CD 21 int 21h
358
359 025D work_c: ;перехватывает +
360 нажатие клавишCtrl+C и
361 025D 33 C0 xor ax,ax ;прерывает +
362 выполнение лю,ых операций
363 025F 2E: A2 0560r mov byte ptr cs:is_haveto_work,al
364 0263 2E: A2 055Fr mov byte ptr cs:is_app_working,al
365 0267 2E: A3 0561r mov word ptr cs:which_app,ax
366
367 026B exit_09h_handler:
368 026B 07 pop es ;
369 026C 1F pop ds +
370 ;восстанавливает регистры
371 026D 61 popa ;
372
373 026E CF iret ;возвращается в +
374 прерванную программу
375
376 026F int09h_handler endp ;конецобработчика
377
378
379
380 ;--------------------------------------- --------
381 ;обработчик прерываниянеактивности DOS
382 ;в этом обработчике выполняется загрузка файла
383 026F int28h_handler proc far
384 026F EB 11 jmp short actual_int28h_handler
385
386 0271 ???????? old_int28h dd ?
387 0275 424B dw 424Bh
388 0277 00 db 00h
389 0278 E9 FECA jmp hw_reset
390 027B 07*(00) db 7 dup (0)
391
392 0282 actual_int28h_handler:
393 0282 9C pushf
394 0283 2E: FF 1E 0271r call dword ptr cs:old_int28h
395
396 0288 60 pusha
397 0289 1E push ds
398 028A 06 push es
399
Turbo Assembler Version 3.1 26/12/02 04:09:58 Page 8
loader.ASM
400 028B A1 0565r mov ax,word ptr [in_dos_addr+2]
401 028E 8E C0 mov es,ax
402 0290 B8 0563r mov ax,offset es:[in_dos_addr] ;проверка флага занятости +
403 DOS
404 +
405 ;так как будутвызываться сложные функции DOS
406 +