Листинг (1071452), страница 3
Текст из файла (страница 3)
583 03ED CD 21 int 21h
584
585 ; -----------------------------------------------------------------
586 03EF 0E push CS ; DS = CS
587 03F0 1F pop DS
588
589 03F1 B4 09 mov AH, 09h ; сообщение о загрузке
590 03F3 BA 045Er lea DX, msg_loadSuccess
591 03F6 CD 21 int 21h
592
593 03F8 B8 3100 mov AX, 3100h ; выйти и оставить в ОП резидентную часть
594 03FB BA 003A mov DX, (tsr_end - start + 10Fh)/16 ; размер резидента
595 03FE CD 21 int 21h
596 0400 load ENDP
597
598 ; +
599 --------------------------------------------------------------
600 --------
601 ; Разбор параметра на предмет '/?'
602 ; Если находит '/?' - выводит справку и выходит из программы (ВАЖНО: выход из программы != +
603 выгрузке резидента)
604 ; Если находит неизвестный аргумент - выводит ошибку и выходит из программы
605 ; Если аргументов нет, ничего не делает
606 ; +
607 --------------------------------------------------------------
608 --------
609
610 0400 params PROC
611 0400 06 push ES
612 0401 B5 00 mov CH, 0
613 0403 26: 8A 0E 0080 mov CL, ES:[80h] ; CL = количество введенных символов
614 0408 80 F9 00 cmp CL, 0 ; если введено 0
615 040B 74 4F je p_noArgs ; выходим из процедуры
616
617 040D BE 0081 mov SI, 81h ; первый считанный символ
618
619 0410 p_checkNextLetter: ; пропустить пробелы
620 0410 26: 8A 04 mov AL, ES:[SI] ; AL - очередной символ
621 0413 3C 20 cmp AL, ' '
622 0415 75 06 jne p_getArgs ; если не пробел – переходим к проверке
623 0417 46 inc SI ; переходим к следующему символу
624 0418 E2 F6 loop p_checkNextLetter
625
626 041A EB 40 90 jmp p_noArgs ; если вся строка состоит из пробелов, аргументов нет +
627
Turbo Assembler Version 3.1 04/18/14 08:08:07 Page 12
kurs1.asm
628
629 041D p_getArgs:
630 041D 26: 8A 04 mov AL, ES:[SI] ; AL - очередной символ
631 0420 3C 2F cmp AL, '/' ; '/?' - первый символ '/'
632 0422 75 1E jne p_errorArgs
633 0424 46 inc SI ; переходим к след букве
634 0425 FE C9 dec CL ; уменьшаем счетчик несчитанных букв
635 0427 80 F9 00 cmp CL, 0 ; если букв больше не осталось - ошибка
636 042A 74 16 je p_errorArgs
637
638 042C 26: 8A 04 mov AL, ES:[SI] ; AL - очередной символ
639 042F 3C 3F cmp AL, '?' ; '/?' - второй символ '?'
640 0431 75 0F jne p_errorArgs
641 0433 46 inc SI ; к след букве
642 0434 FE C9 dec CL
643 0436 80 F9 00 cmp CL, 0 ; если букв не осталось, значит введено точно '/?', выведем +
644 help-сообщение
645 0439 74 14 je p_help
646
647 043B 26: 8A 04 mov AL, ES:[SI] ; если буквы всё таки остали, но следующая буква за '/?' - пробел, +
648 выведем help-сообщение
649 043E 3C 20 cmp AL, ' '
650 0440 74 0D je p_help
651
652 0442 p_errorArgs:
653 0442 07 pop ES
654 0443 B4 09 mov AH, 09h ; сообщение об ошибке
655 0445 BA 0500r lea DX, msg_badArgs
656 0448 CD 21 int 21h
657 044A B8 4C01 mov AX, 4C01h ; выйдем с кодом ошибки 1
658 044D CD 21 int 21h
659
660 044F p_help:
661 044F 07 pop ES
662 0450 B4 09 mov AH, 09h ; help-сообщение
663 0452 BA 0470r lea DX, msg_help
664 0455 CD 21 int 21h
665 0457 B8 4C00 mov AX, 4C00h ; выйдем с кодом 0 (успех)
666 045A CD 21 int 21h
667
668 045C p_noArgs:
669 045C 07 pop ES
670 045D C3 ret ; выйдем из ПРОЦЕДУРЫ
671 045E params ENDP
672
673 ; ------------------------------------------------------------
674 ; ----------------- Блок данных, используемых только при загрузке резидента --------------------
675 ; ------------------------------------------------------------
676
677 045E 90 A5 A7 A8 A4 A5 AD+ msg_loadSuccess db 'Резидент загружен$'
678 E2 20 A7 A0 A3 E0 E3+
679 A6 A5 AD 24
680 0470 46 39 20 2D 20 A7 A0+ msg_help db 'F9 - запустить таймер на 7 секунд', 10, 13, \
681 AF E3 E1 E2 A8 E2 EC+ 'F1 - включить курсив русской буквы И', 10, 13, \
682 20 E2 A0 A9 AC A5 E0+ 'F2 - руссифицировать ЛМНОП', 10, 13, \
683 20 AD A0 20 37 20 E1+ 'F3 - заблокировать ввод латинских символов', '$'
684 A5 AA E3 AD A4 0A 0D+
Turbo Assembler Version 3.1 04/18/14 08:08:07 Page 13
kurs1.asm
685 46 31 20 2D 20 A2 AA+
686 AB EE E7 A8 E2 EC 20+
687 AA E3 E0 E1 A8 A2 20+
688 E0 E3 E1 E1 AA AE A9+
689 20 A1 E3 AA A2 EB 20+
690 88 0A 0D 46 32 20 2D+
691 20 E0 E3 E1 E1 A8 E4+
692 A8 E6 A8 E0 AE A2 A0+
693 E2 EC 20 8B 8C 8D 8E+
694 8F 0A 0D 46 33 20 2D+
695 20 A7 A0 A1 AB AE AA+
696 A8 E0 AE A2 A0 E2 EC+
697 20 A2 A2 AE A4 20 AB+
698 A0 E2 A8 AD E1 AA A8+
699 E5 20 E1 A8 AC A2 AE+
700 AB AE A2 24
701 0500 8E E8 A8 A1 AA A0 20+ msg_badArgs db 'Ошибка в аргументах$'
702 A2 20 A0 E0 A3 E3 AC+
703 A5 AD E2 A0 E5 24
704
705 ; ----------------------------------------------------------------------------------------------
706
707 0514 codeSegment ENDS
708
709 END start
Turbo Assembler Version 3.1 04/18/14 08:08:07 Page 14
Symbol Table
Symbol Name Type Value
??DATE Text "04/18/14"
??FILENAME Text "kurs1 "
??TIME Text "08:08:07"
??VERSION Number 030A
@32BIT Text 0
@CODE Text DGROUP
@CODESIZE Text 0
@CPU Text 0707H
@CURSEG Text CODESEGMENT
@DATA Text DGROUP
@DATASIZE Text 0
@FILENAME Text KURS1
@INTERFACE Text 00H
@MODEL Text 1
@STACK Text DGROUP
@WORDSIZE Text 2
IGNORELETTER Near CODESEGMENT:01AB
IGNORE_ACTIVE Byte CODESEGMENT:0175
IGNORE_KEY Number 003D
IGNORE_TABLE Byte CODESEGMENT:0176
IL_1 Near CODESEGMENT:01C1
IL_EXIT Near CODESEGMENT:01E7
IL_EXITPOP Near CODESEGMENT:01E5
IL_NEXTLETTER Near CODESEGMENT:01D0
INIT Near CODESEGMENT:0392
INT09H_OFFSET Word CODESEGMENT:0133
INT09H_SEGMENT Word CODESEGMENT:0135
INT1CH_OFFSET Word CODESEGMENT:0137
INT1CH_SEGMENT Word CODESEGMENT:0139
INT2FH_OFFSET Word CODESEGMENT:012F
INT2FH_SEGMENT Word CODESEGMENT:0131
I_GO_LOADING Near CODESEGMENT:03B0
KURS_ACTIVE Byte CODESEGMENT:0158
KURS_KEY Number 003B
KURS_SYMBOLINDEX Number 0088
KURS_SYMBOLNEW Byte CODESEGMENT:0159
LOAD Near CODESEGMENT:0398
MSG_ALREADYLOADED Byte CODESEGMENT:0119
MSG_BADARGS Byte CODESEGMENT:0500
MSG_HELP Byte CODESEGMENT:0470
MSG_LOADSUCCESS Byte CODESEGMENT:045E
MSG_UNLOAD Byte CODESEGMENT:0103
NEW09H_CTRLU Near CODESEGMENT:02AC
NEW09H_DONTEXIT Near CODESEGMENT:0239
NEW09H_GOFAREXIT Near CODESEGMENT:0236
NEW09H_IGNORE_ACTIVE Near CODESEGMENT:02D1
NEW09H_IGNORE_KEY Near CODESEGMENT:028D
NEW09H_KURS_KEY Near CODESEGMENT:0277
NEW09H_NEWEXIT Near CODESEGMENT:02DA
NEW09H_OLDEXIT Near CODESEGMENT:02D1
NEW09H_RUSS_ACTIVE Near CODESEGMENT:02BC
NEW09H_RUSS_KEY Near CODESEGMENT:0282
NEW09H_TMR_KEY Near CODESEGMENT:0245
NEW1CH_EXIT Near CODESEGMENT:0325
Turbo Assembler Version 3.1 04/18/14 08:08:07 Page 15
Symbol Table
NEW2FH_QQ Near CODESEGMENT:033C
NEW2FH_TSRUNLOAD Near CODESEGMENT:0340
NEW_09H Near CODESEGMENT:021B
NEW_1CH Near CODESEGMENT:02ED
NEW_2FH Near CODESEGMENT:0326
OLD2FH_CALL Near CODESEGMENT:0337
OLDKURSRETURN Near CODESEGMENT:026A
PARAMS Near CODESEGMENT:0400
P_CHECKNEXTLETTER Near CODESEGMENT:0410
P_ERRORARGS Near CODESEGMENT:0442
P_GETARGS Near CODESEGMENT:041D
P_HELP Near CODESEGMENT:044F
P_NOARGS Near CODESEGMENT:045C
RL_EXITFAIL Near CODESEGMENT:0218
RL_NEXTLETTER Near CODESEGMENT:01FA
RUSSLETTER Near CODESEGMENT:01E8
RUSS_ACTIVE Byte CODESEGMENT:0169
RUSS_ASCII Byte CODESEGMENT:0170
RUSS_KEY Number 003C
RUSS_SCANCODE Byte CODESEGMENT:016A
START Near CODESEGMENT:0100
TMR_ACTIVE Byte CODESEGMENT:0155
TMR_KEY Number 0043
TMR_MSG Byte CODESEGMENT:013B
TMR_TIME Word CODESEGMENT:0156
TMR_TIMEALL Number 1B58
TSR_END Number CODESEGMENT:0392
Groups & Segments Bit Size Align Combine Class
CODESEGMENT 16 0514 Para none CODE
DGROUP Group
_DATA 16 0000 Word Public DATA
_TEXT 16 0000 Word Public CODE