Текст программы (1071438), страница 2
Текст из файла (страница 2)
308 02FF Loaded:
309 ;Действия по установке программы в памяти
310 02FF E8 0061 call SaveOldVectors
311 0302 E8 007B call SetNewVectors
312 0305 BB 0410r lea BX, MesLoaded
313 0308 E8 FFB8 call PrintStr
314 ;Оставим программу резидентной
315 030B BA 002F mov DX,(ressize+10Fh)/16;Размер в параграфах
316 030E B8 3100 mov AX, 3100h ;функция завершить и оставить в памяти
317 0311 CD 21 int 21h
318 0313 installed:
319 0313 80 3E 0407r 01 cmp UnloadFlag,1 ;Запрос на выгузку установлен?
320 0318 74 05 je unload ;Да, на выгрузку
321 031A B8 4C01 mov ax,4c01h ;Завешим программу обычным образом
322 031D CD 21 int 21h ;код завершения = 1
323 031F unload:
324 031F E8 0011 call CheckOther
325 ;Прервем резидентную копию программы
326 0322 B4 C8 mov AH,0C8h ;Наша функция прерывания 2Fh
327 0324 B0 01 mov AL,01h ;Подфункция прерывания
328 0326 CD 2D int 2Dh
329 0328 BB 0463r lea BX,MesUnloaded
330 032B E8 FF95 call PrintStr
331 ;Первая копия программы выгружена. Завершим и эту.
332 032E B8 4C00 mov ax,4c00h ;Завешим программу обычным образом
333 0331 CD 21 int 21h ;код завершения = 0
334 0333 init endp
335 ;------------------------------------------------------------
336 ;
337 ;------------------------------------------------------------
338 0333 CheckOther proc
339 ;Сохраним вектор мультиплексного прерывания 2Dh
340 0333 B4 35 mov AH,35h ;Функция получения вектора
341 0335 B0 2D mov AL,2Dh ;Номер вектора
342 0337 CD 21 int 21h
Turbo Assembler Version 4.1 28/12/06 12:26:45 Page 7
OPCL.asm
343 0339 89 1E 0408r mov word ptr temp_2Dh,BX ;Сохраним старое IP
344 ;Сохраним вектор DOS прерывания 21h
345 033D B4 35 mov AH,35h ;Функция получения вектора
346 033F B0 21 mov AL,21h ;Номер вектора
347 0341 CD 21 int 21h
348 0343 89 1E 040Cr mov word ptr temp_21h,BX ;Сохраним старое IP
349 ;Проверка наша программа ли была загружена?
350 0347 81 3E 0408r 0179r cmp word ptr temp_2Dh, offset new_2Dh
351 034D 75 09 jne OtherLoaded
352 034F 81 3E 040Cr 01C5r cmp word ptr temp_21h, offset new_21h
353 0355 75 01 jne OtherLoaded
354 0357 C3 ret
355 0358 OtherLoaded:
356 0358 BB 053Cr lea BX,MesOtherLoaded
357 035B E8 FF65 call PrintStr
358 035E B8 4C00 mov ax,4c00h ;Завешим программу обычным образом
359 0361 CD 21 int 21h ;код завершения = 0
360 0363 CheckOther endp
361 ;--------------------------------------------------------
362 ; Процедура сохранения старого обработчика прерываний
363 ;--------------------------------------------------------
364 0363 SaveOldVectors proc
365 ;Сохраним вектор мультиплексного прерывания 2Dh
366 0363 B4 35 mov AH,35h ;Функция получения вектора
367 0365 B0 2D mov AL,2Dh ;Номер вектора
368 0367 CD 21 int 21h
369 0369 89 1E 0103r mov word ptr old_2Dh,BX ;Сохраним старое IP
370 036D 8C 06 0105r mov word ptr old_2Dh+2,ES ;Сохраним старое CS
371 ;Сохраним вектор DOS прерывания 21h
372 0371 B4 35 mov AH,35h ;Функция получения вектора
373 0373 B0 21 mov AL,21h ;Номер вектора
374 0375 CD 21 int 21h
375 0377 89 1E 0107r mov word ptr old_21h,BX ;Сохраним старое IP
376 037B 8C 06 0109r mov word ptr old_21h+2,ES;Сохраним старое CS
377 037F C3 ret
378 0380 SaveOldVectors endp
379 ;------------------------------------------------------
380 ; Процедура установки новых векторов
381 ;-------------------------------------------------------
382 0380 SetNewVectors proc
383 ;Заполним вектор мультиплексного прерывания 2Dh
384 0380 B4 25 mov AH,25h ;Функция заполнения вектора
385 0382 B0 2D mov AL,2Dh ;Номер вектора
386 0384 BA 0179r mov DX, offset new_2Dh ;Адрес нового обработчика
387 0387 CD 21 int 21h
388 ;Заполним вектор DOS прерывания 21h
389 0389 B4 25 mov AH,25h ;Функция заполнения вектора
390 038B B0 21 mov AL,21h ;Номер вектора
391 038D BA 01C5r mov DX, offset new_21h ;Адрес нового обработчика
392 0390 CD 21 int 21h
393 0392 C3 ret
394 0393 SetNewVectors endp
395 ;------------------------------------------------------
396 ; Процедура проверки параметра
397 ;------------------------------------------------------
398 0393 CmdLine proc
399 ;Получим хвост комманы из PSP
Turbo Assembler Version 4.1 28/12/06 12:26:45 Page 8
OPCL.asm
400 0393 26: 8A 0E 0080 mov CL,ES:80h ;Длина хвоста из PSP
401 0398 80 F9 00 cmp CL,0
402 039B 74 15 je ahead ;Программа запущена без параметров
403 039D 32 ED xor CH,CH ;Теперь CX=CL=длина хвоста
404 039F 8B D1 mov DX,CX ;Сохраним CX в DX
405 03A1 BE 0405r lea SI, tailHelp ;DS:SI->поле tailHelp в проге
406 03A4 8B CA mov CX,DX ;Восстановим CX из DX
407 03A6 E8 0038 call scanHelp
408 03A9 WrongParam: ;Введен неверный параметр
409 03A9 BB 0499r lea BX, MesWrongParam
410 03AC E8 FF14 call PrintStr
411 03AF E8 0041 call Help
412 03B2 ahead:
413 03B2 B4 C8 mov AH,0C8h ;Наша функция прерывания 2Dh
414 03B4 B0 00 mov AL,00 ;Подфункция проверки установки
415 03B6 CD 2D int 2Dh
416 03B8 3C FF cmp Al,0FFh
417 03BA 75 11 jne NOT_I
418 ;Прервем резидентную копию программы
419 03BC B4 C8 mov AH,0C8h ;Наша функция прерывания 2Dh
420 03BE B0 01 mov AL,01h ;Подфункция прерывания
421 03C0 CD 2D int 2Dh
422 03C2 BB 0463r lea BX,MesUnloaded
423 03C5 E8 FEFB call PrintStr
424 ;Первая копия программы выгружена. Завершим и эту.
425 03C8 B8 4C00 mov ax,4c00h ;Завешим программу обычным образом
426 03CB CD 21 int 21h ;код завершения = 0
427 03CD NOT_I:
428 03CD C3 ret
429 03CE CmdLine endp
430
431 03CE scanUnload proc
432 ;Процедура сканирования хвоста на пробелы
433 03CE FC cld ;Вперед
434 03CF BF 0081 mov DI,81h ;ES:DI->хвост в PSP
435 03D2 F3> AE repe scasb
436 03D4 4F dec DI ;DI->на первый символ после пробелов
437 03D5 B9 0002 mov CX,2 ;Ожидаемая длина праметра
438 03D8 F3> A6 repe cmpsb ;Сравниваем введенный текст с ожидаемым
439 03DA 75 04 jne GoExitUnload ;Введена неизвестная комманда
440 03DC FE 06 0407r inc UnloadFlag ;Установим флаг на выгрузку
441 03E0 GoExitUnload:
442 03E0 C3 ret
443 03E1 scanUnload endp
444 ;-----------------------------------------------------------
445 ;Проверка параметра на хелп
446 ;-----------------------------------------------------------
447 03E1 scanHelp proc
448 ;Процедура сканирования хвоста на пробелы
449 03E1 FC cld ;Вперед
450 03E2 BF 0081 mov DI,81h ;ES:DI->хвост в PSP
451 03E5 F3> AE repe scasb
452 03E7 4F dec DI ;DI->на первый символ после пробелов
453 03E8 B9 0002 mov CX,2 ;Ожидаемая длина праметра
454 03EB F3> A6 repe cmpsb ;Сравнивае введенный текст с ожидаемым
455 03ED 75 03 jne GoExitHelp ;Введена неизвестная комманда
456 03EF E8 0001 call Help ;Вывод справки
Turbo Assembler Version 4.1 28/12/06 12:26:45 Page 9
OPCL.asm
457 03F2 GoExitHelp:
458 03F2 C3 ret
459 03F3 scanHelp endp
460
461 03F3 Help proc ;Процедура вызова справки и
462 ;завершение программы
463 03F3 BB 04B2r lea BX, MesHelp
464 03F6 E8 FECA call Printstr
465 03F9 B8 4C02 mov AX,4c02h ;Завешим программу обычным образом
466 03FC CD 21 int 21h ;код завершения = 1
467 03FE C3 ret
468 03FF Help endp
469 ;------------------------------------------------------------
470 ; Процедура вызова 21 прерывания
471 ;------------------------------------------------------------
472 03FF call_int21h proc
473 03FF 2E: FF 1E 0107r call CS:old_21h
474 0404 CF iret
475 0405 call_int21h endp
476 ;------------------------------------------------------------
477 ;Поля для транзитной части программы
478
479 0405 2F 3F tailHelp db '/?'
480 0407 00 UnloadFlag db 0 ;Флаг требования выгрузки
481 0408 00000000 temp_2Dh dd 0
482 040C 00000000 temp_21h dd 0
483 0410 50 72 6F 67 72 61 6D+ MesLoaded db 'Program ',22h,'INT registrator',22h,'was loaded to memory.', +
484 20 22 49 4E 54 20 72+ 10,13,0
485 65 67 69 73 74 72 61+
486 74 6F 72 22 77 61 73+
487 20 6C 6F 61 64 65 64+
488 20 74 6F 20 6D 65 6D+
489 6F 72 79 2E 0A 0D 00
490 0441 44 6F 75 62 6C 65 20+ db 'Double uploading is impossible.',10,13,0
491 75 70 6C 6F 61 64 69+
492 6E 67 20 69 73 20 69+
493 6D 70 6F 73 73 69 62+
494 6C 65 2E 0A 0D 00
495 0463 50 72 6F 67 72 61 6D+ MesUnloaded db 'Program ',22h,'INT registrator',22h,' was unloaded from memory.',10, +
496 20 22 49 4E 54 20 72+ 13,0
497 65 67 69 73 74 72 61+
498 74 6F 72 22 20 77 61+
499 73 20 75 6E 6C 6F 61+
500 64 65 64 20 66 72 6F+
501 6D 20 6D 65 6D 6F 72+
502 79 2E 0A 0D 00
503 0499 42 61 64 20 63 61 6C+ MesWrongParam db 'Bad call of program.',10,13,10,13,0
504 6C 20 6F 66 20 70 72+
505 6F 67 72 61 6D 2E 0A+
506 0D 0A 0D 00
507 04B2 48 6F 77 20 74 6F 20+ MesHelp db 'How to use program ',22h,'INT registrator',22h,': OPCL.COM [/?]',10,13
508 75 73 65 20 70 72 6F+
509 67 72 61 6D 20 22 49+
510 4E 54 20 72 65 67 69+
511 73 74 72 61 74 6F 72+
512 22 3A 20 4F 50 43 4C+
513 2E 43 4F 4D 20 5B 2F+
Turbo Assembler Version 4.1 28/12/06 12:26:45 Page 10
OPCL.asm
514 3F 5D 0A 0D
515 04E7 54 6F 20 6C 6F 61 64+ db 'To load to memory: OPCL.COM',10,13
516 20 74 6F 20 6D 65 6D+
517 6F 72 79 3A 20 4F 50+
518 43 4C 2E 43 4F 4D 0A+
519 0D
520 0504 54 6F 20 75 6E 6C 6F+ db 'To unload from memory: UNLDTSR.EXE',10,13
521 61 64 20 66 72 6F 6D+
522 20 6D 65 6D 6F 72 79+
523 3A 20 55 4E 4C 44 54+
524 53 52 2E 45 58 45 0A+
525 0D
526 0528 48 65 6C 70 3A 20 4F+ db 'Help: OPCL.COM /?',10,13,0
527 50 43 4C 2E 43 4F 4D+
528 20 2F 3F 0A 0D 00
529 053C CD E5 E2 EE E7 EC EE+ MesOtherLoaded db 'Невозможно выгрузить программу ',22h,'Регистратор событий',22h,' из +
530 E6 ED EE 20 E2 FB E3+ памяти.',10,13
531 F0 F3 E7 E8 F2 FC 20+
532 EF F0 EE E3 F0 E0 EC+
533 EC F3 20 22 D0 E5 E3+
534 E8 F1 F2 F0 E0 F2 EE+
535 F0 20 F1 EE E1 FB F2+
536 E8 E9 22 20 E8 E7 20+
537 EF E0 EC FF F2 E8 2E+
538 0A 0D
539 057D C2 EE E7 EC EE E6 ED+ db 'Возможно для векторов 2Dh, 21h были установлены новые обработчики +
540 EE 20 E4 EB FF 20 E2+ прерываний',10,13,0
541 E5 EA F2 EE F0 EE E2+
542 20 32 44 68 2C 20 32+
543 31 68 20 E1 FB EB E8+
544 20 F3 F1 F2 E0 ED EE+
545 E2 EB E5 ED FB 20 ED+
546 EE E2 FB E5 20 EE E1+
547 F0 E0 E1 EE F2 F7 E8+
548 EA E8 20 EF F0 E5 F0+
549 FB E2 E0 ED E8 E9 0A+
550 0D 00
551 05CC ???? handle dw ?
552 05CE 00 fhandle db 0
553 05CF 00 fhandle2 db 0
554
555 05D0 4C 4F 47 2E 54 58 54+ newfile db 'LOG.TXT',0
556 00
557 05D8 ???? opclfile dw ?
558 05DA ???? opclfile2 dw ?
559 05DC 66 69 6C 65 20 77 61+ string db 'file was opened',10, 13
560 73 20 6F 70 65 6E 65+
561 64 0A 0D
562 =0011 stringln equ $-string
563 05ED text ends
564 end main
Turbo Assembler Version 4.1 28/12/06 12:26:45 Page 11
Symbol Table
Symbol Name Type Value Cref (defined at #)
??DATE Text "24/05/07"
??FILENAME Text "OPCL "
??TIME Text "12:26:45"
??VERSION Number 040A
@CPU Text 0101H
@CURSEG Text TEXT #1
@FILENAME Text OPCL
@WORDSIZE Text 2 #1
AHEAD Near TEXT:03B2 402 #412
CALL_INT21H Near TEXT:03FF #472
CHECKOTHER Near TEXT:0333 324 #338
CLOSEFILE Near TEXT:025A 125 #194