Текст_Программы (1071473), страница 2
Текст из файла (страница 2)
1 321 0320 B0 21 mov AL,21h ;Номер вектора
1 322 0322 CD 21 int 21h
1 323 0324 89 1E 0107r mov word ptr old_21h,BX ;Сохраним старое IP
1 324 0328 8C 06 0109r mov word ptr old_21h+2,ES;Сохраним старое CS
1 325 032C C3 ret
1 326 032D SaveOldVectors endp
1 327
1 328 032D SetNewVectors proc
1 329 ;Заполним вектор мультиплексного прерывания 2Fh
1 330 032D B4 25 mov AH,25h ;Функция заполнения вектора
1 331 032F B0 2D mov AL,2Dh ;Номер вектора
1 332 0331 BA 0171r mov DX, offset new_2Dh ;Адрес нового обработчика
1 333 0334 CD 21 int 21h
1 334 ;Заполним вектор DOS прерывания 21h
1 335 0336 B4 25 mov AH,25h ;Функция заполнения вектора
1 336 0338 B0 21 mov AL,21h ;Номер вектора
1 337 033A BA 01BDr mov DX, offset new_21h ;Адрес нового обработчика
1 338 033D CD 21 int 21h
1 339 033F C3 ret
1 340 0340 SetNewVectors endp
1 341
1 342 0340 CmdLine proc
_Turbo Assembler Version 3.1 21/12/02 20:12:37 Page 7
log.asm
1 343 ;Получим хвост комманы из PSP
1 344 0340 26: 8A 0E 0080 mov CL,ES:80h ;Длина хвоста из PSP
1 345 0345 80 F9 00 cmp CL,0
1 346 0348 74 15 je ahead ;Программа запущена без параметров
1 347 034A 32 ED xor CH,CH ;Теперь CX=CL=длина хвоста
1 348 034C 8B D1 mov DX,CX ;Сохраним CX в DX
1 349 034E BE 03ACr lea SI, tailHelp ;DS:SI->поле tailHelp в проге
1 350 0351 8B CA mov CX,DX ;Восстановим CX из DX
1 351 0353 E8 0038 call scanHelp
1 352 0356 WrongParam: ;Введен неверный параметр
1 353 0356 BB 0454r lea BX, MesWrongParam
1 354 0359 E8 FF14 call PrintStr
1 355 035C E8 0041 call Help
1 356 035F ahead:
1 357 035F B4 C8 mov AH,0C8h ;Наша функция прерывания 2Fh
1 358 0361 B0 00 mov AL,00 ;Подфункция проверки установки
1 359 0363 CD 2D int 2Dh
1 360 0365 3C FF cmp Al,0FFh
1 361 0367 75 11 jne NOT_I
1 362 ;Прервем резидентную копию программы
1 363 0369 B4 C8 mov AH,0C8h ;Наша функция прерывания 2Fh
1 364 036B B0 01 mov AL,01h ;Подфункция прерывания
1 365 036D CD 2D int 2Dh
1 366 036F BB 0415r lea BX,MesUnloaded
1 367 0372 E8 FEFB call PrintStr
1 368 ;Первая копия программы выгружена. Завершим и эту.
1 369 0375 B8 4C00 mov ax,4c00h ;Завешим программу обычным образом
1 370 0378 CD 21 int 21h ;код завершения = 0
1 371 037A NOT_I:
1 372 037A C3 ret
1 373 037B CmdLine endp
1 374
1 375 037B scanUnload proc
1 376 ;Процедура сканирования хвоста на пробелы
1 377 037B FC cld ;Вперед
1 378 037C BF 0081 mov DI,81h ;ES:DI->хвост в PSP
1 379 037F F3> AE repe scasb
1 380 0381 4F dec DI ;DI->на первый символ после пробелов
1 381 0382 B9 0002 mov CX,2 ;Ожидаемая длина праметра
1 382 0385 F3> A6 repe cmpsb ;Сравниваем введенный текст с ожидаемым
1 383 0387 75 04 jne GoExitUnload ;Введена неизвестная комманда
1 384 0389 FE 06 03AEr inc UnloadFlag ;Установим флаг на выгрузку
1 385 038D GoExitUnload:
1 386 038D C3 ret
1 387 038E scanUnload endp
1 388
1 389 038E scanHelp proc
1 390 ;Процедура сканирования хвоста на пробелы
1 391 038E FC cld ;Вперед
1 392 038F BF 0081 mov DI,81h ;ES:DI->хвост в PSP
1 393 0392 F3> AE repe scasb
1 394 0394 4F dec DI ;DI->на первый символ после пробелов
1 395 0395 B9 0002 mov CX,2 ;Ожидаемая длина праметра
1 396 0398 F3> A6 repe cmpsb ;Сравнивае введенный текст с ожидаемым
1 397 039A 75 03 jne GoExitHelp ;Введена неизвестная комманда
1 398 039C E8 0001 call Help ;Вывод справки
1 399 039F GoExitHelp:
_Turbo Assembler Version 3.1 21/12/02 20:12:37 Page 8
log.asm
1 400 039F C3 ret
1 401 03A0 scanHelp endp
1 402
1 403 03A0 Help proc ;Процедура вызова справки и
1 404 ;завершение программы
1 405 03A0 BB 0471r lea BX, MesHelp
1 406 03A3 E8 FECA call Printstr
1 407 03A6 B8 4C02 mov AX,4c02h ;Завешим программу обычным образом
1 408 03A9 CD 21 int 21h ;код завершения = 1
1 409 03AB C3 ret
1 410 03AC Help endp
1 411
1 412 ;Поля для транзитной части программы
1 413
1 414 03AC 2F 3F tailHelp db '/?'
1 415 03AE 00 UnloadFlag db 0 ;Флаг требования выгрузки
1 416 03AF 00000000 temp_2Dh dd 0
1 417 03B3 00000000 temp_21h dd 0
1 418 03B7 8F E0 AE A3 E0 A0 AC+ MesLoaded db 'Программа ',22h,'Регистратор событий',22h,' успешно загружена +
419 AC A0 20 22 90 A5 A3+ в память.',10,13,0
420 A8 E1 E2 E0 A0 E2 AE+
421 E0 20 E1 AE A1 EB E2+
422 A8 A9 22 20 E3 E1 AF+
423 A5 E8 AD AE 20 A7 A0+
424 A3 E0 E3 A6 A5 AD A0+
425 20 A2 20 AF A0 AC EF+
426 E2 EC 2E 0A 0D 00
1 427 03F5 8F AE A2 E2 AE E0 AD+ db 'Повторная загрузка запрещена.',10,13,0
428 A0 EF 20 A7 A0 A3 E0+
429 E3 A7 AA A0 20 A7 A0+
430 AF E0 A5 E9 A5 AD A0+
431 2E 0A 0D 00
1 432 0415 8F E0 AE A3 E0 A0 AC+ MesUnloaded db 'Программа ',22h,'Регистратор событий',22h,' успешно выгружена из +
433 AC A0 20 22 90 A5 A3+ памяти.',10,13,0
434 A8 E1 E2 E0 A0 E2 AE+
435 E0 20 E1 AE A1 EB E2+
436 A8 A9 22 20 E3 E1 AF+
437 A5 E8 AD AE 20 A2 EB+
438 A3 E0 E3 A6 A5 AD A0+
439 20 A8 A7 20 AF A0 AC+
440 EF E2 A8 2E 0A 0D 00
1 441 0454 8D A5 A2 A5 E0 AD EB+ MesWrongParam db 'Неверный вызов прогаммы.',10,13,10,13,0
442 A9 20 A2 EB A7 AE A2+
443 20 AF E0 AE A3 A0 AC+
444 AC EB 2E 0A 0D 0A 0D+
445 00
1 446 0471 91 A8 AD E2 A0 AA E1+ MesHelp db 'Синтаксис вызова прогаммы ',22h,'Регистратор событий',22h,': LOG.COM +
447 A8 E1 20 A2 EB A7 AE+ [/?]',10,13
448 A2 A0 20 AF E0 AE A3+
449 A0 AC AC EB 20 22 90+
450 A5 A3 A8 E1 E2 E0 A0+
451 E2 AE E0 20 E1 AE A1+
452 EB E2 A8 A9 22 3A 20+
453 4C 4F 47 2E 43 4F 4D+
454 20 5B 2F 3F 5D 0A 0D
1 455 04B0 84 AB EF 20 A7 A0 A3+ db 'Для загрузки в память: LOG.COM',10,13
456 E0 E3 A7 AA A8 20 A2+
_Turbo Assembler Version 3.1 21/12/02 20:12:37 Page 9
log.asm
457 20 AF A0 AC EF E2 EC+
458 3A 20 4C 4F 47 2E 43+
459 4F 4D 0A 0D
1 460 04D0 84 AB EF 20 A2 EB A3+ db 'Для выгрузки из памяти: LOG.COM',10,13
461 E0 E3 A7 AA A8 20 A8+
462 A7 20 AF A0 AC EF E2+
463 A8 3A 20 4C 4F 47 2E+
464 43 4F 4D 0A 0D
1 465 04F1 84 AB EF 20 A2 EB A2+ db 'Для вывода справки: LOG.COM /?',10,13,0
466 AE A4 A0 20 E1 AF E0+
467 A0 A2 AA A8 3A 20 4C+
468 4F 47 2E 43 4F 4D 20+
469 2F 3F 0A 0D 00
1 470 0512 8D A5 A2 AE A7 AC AE+ MesOtherLoaded db 'Невозможно выгрузить программу ',22h,'Регистратор событий',22h,' из +
471 A6 AD AE 20 A2 EB A3+ памяти.',10,13
472 E0 E3 A7 A8 E2 EC 20+
473 AF E0 AE A3 E0 A0 AC+
474 AC E3 20 22 90 A5 A3+
475 A8 E1 E2 E0 A0 E2 AE+
476 E0 20 E1 AE A1 EB E2+
477 A8 A9 22 20 A8 A7 20+
478 AF A0 AC EF E2 A8 2E+
479 0A 0D
1 480 0553 82 AE A7 AC AE A6 AD+ db 'Возможно для векторов 2Dh, 21h были установлены новые обработчики +
481 AE 20 A4 AB EF 20 A2+ прерываний',10,13,0
482 A5 AA E2 AE E0 AE A2+
483 20 32 44 68 2C 20 32+
484 31 68 20 A1 EB AB A8+
485 20 E3 E1 E2 A0 AD AE+
486 A2 AB A5 AD EB 20 AD+
487 AE A2 EB A5 20 AE A1+
488 E0 A0 A1 AE E2 E7 A8+
489 AA A8 20 AF E0 A5 E0+
490 EB A2 A0 AD A8 A9 0A+
491 0D 00
1 492
493 05A2 text ends
494 end main
12