Методическое пособие для выполнения лабораторных работ и КР (1075934), страница 20
Текст из файла (страница 20)
В этомслучае в текстовом редакторе под WINDOWS данные сообщения правильночитаться не будут.Кстати, используя русификатор, Вы дополнительно проверяете правильность своейпрограммы в части вызова старого обработчика прерывания. Необходимо корректно вызвать старый обработчик. В тех случаях, когда используется полная обработка прерываниясобственным резидентов, ввод русских символов с клавиатуры становиться недоступным.18.26. ДЗ и ТЗ на КРВ 4-м семестре студенты в виде домашнего задания (ДЗ) разрабатывают и защищают ТЗ на резидентную программу курсовой работы по СП, которая выполняется поплану 5-го семестра.
Требования к выполнению ДЗ, варианты КР и требования к документации размещены на сайте и периодически обновляются. Студенты должны изучить эти2010 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”90требования, без ошибок выбрать свой вариант и сдать ДЗ в указанные сроки.
Нумерациявариантов КР в 5-м семестре сохраняется из 4-го семестра. Документ должен быть оформлен правильно и без ошибок и сохранен в последней редакции для использования в 5-мсеместре (один экземпляр ТЗ остается у преподавателя, а другой у студента).18.27. КРВ 5-м семестре студенты выполняют курсовую работу по дисциплине СП. Требования к выполнению КР, варианты КР и требования к документации размещены на сайтеи периодически обновляются. Работа заключается в следующих основных заданиях:− разработка проекта программы резидента по заданному варианту,− разработка и отладка программы резидента,− разработка комплекта документации на программный продукт,− сдача и защита КР на основе предоставленных материалов и проведенияприемно-сдаточных испытаний, которые проводятся на основе специальнойпрограммы испытаний.КР работа выполняется и защищается каждым студентом индивидуально.
По результатам проверки документации и проведенных испытаний проставляется оценка, которая идет в диплом.18.28. Автономная программа для выгрузки TSRВ вариантах курсовой работы предусмотрен случай выгрузки резидента с помощьюспециальной автономной программы. В этом варианте необходимо создать программу,которая обращается к резиденту с помощью прерывания 2D (2F).
С помощью этого прерывания сначала нужно проверить наличие резидента в памяти, а затем выдать сигнал выгрузки. Далее показан пример программы, в которой выполняются такие действия.; Программа выгрузки резидента (unload.asm)MYCODE SEGMENT 'CODE'ASSUME CS:MYCODESTART:; Загрузка сегментного регистра данных DSPUSH CSPOP DS; Проверка наличия резидента в ОПMOV AH, 0EEhMOV AL, 1; Проверка наличияINT 2DhCMP AL, 0FFhJNE NO_LOAD ; переход если резидент не(!) в памяти; ВызрузкаMOV AH , 0EEHMOV AL,2INT 2DhCMP AL , 0FFH; проверка ответа от нашего резидента должнобыть 0FFHJNE ERR; Сообщение об успешной выгрузкеMOV AH , 09HMOV DX, OFFSET MSG_UNLDINT21HJMP EXIT;Ошибка выгрузкиERR:MOV AH , 09H912010 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”MOV DX, OFFSET MSG_ERRINT21HJMP EXIT; Сообщение о том, что уже загруженNO_LOAD:MOV AH , 09HMOV DX, OFFSET MSG_NOUNLDINT21H; Выход из программыEXIT:MOV AL, 0MOV AH, 4CHINT 21H;СообщенияMSG_NOUNLDDB 'TSR is NO in memory!', 10,13,'$'MSG_UNLD DB 'TSR was unloaded (Unload programm)!', 10,13,'$'MSG_ERR DB 'Ошибка выгрузки резидента!', 10,13,'$'; ASCII!!!MYCODE ENDSEND STARTКомпиляция данной программы должна быть выполнена в формате .EXE.
Мы получим UNLOAD.EXE. Запуск этой программы при загруженном резиденте приводит кследующей реакции в командной строке:C:\work> unloadC:\work>TSR was unloaded (Unload programm)!C:\work>_Если резидента в памяти не обнаружено, то получим:C:\work> unloadC:\work> TSR is NO in memory!C:\work>_Выгрузку можно выполнить и другим способом, рассмотренным выше, без использования обработчика собственного прерывания (2D), при этом должны быть восстановлены старые обработчики и освобождена оперативная память.18.29.
Пример резидентной программыНиже приводиться текст простой (функционально) резидентной программы, которая содержит все системные требования, заданные в курсовой работе студентов по дисциплине СП.Данная программа, после выполнения загрузки резидента, при нажатии на функциональную клавишу F1 выводить на экран дисплея сообщение –“ TSR: F1 - pushed!!!”.Перечень основных функций перечислен в заголовке программы.;;;;;;Пример простой резидентной программы ( tsrpos.asm )-> tsrpos.comПо F1 - выводиться строкаПо Ctrl+F1 - программа выгружаетсяВыполняется проверка повторности запуска TSRВыполняется вызов справки по /H или /hВыполняется выгрузка из части инициализации /U или /uCODEPR SEGMENT PARAASSUME CS:CODEPR , DS:CODEPRPSP:ORG 100H; Область PSP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Резидентная частьBEGIN:JMPINIT; Переход к части инициализации;Данные резидентаSAVEINT9 DD ?; Сохранение старого обработчика922010 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”SAVEINT2D DD ?; Сохранение старого обработчикаFLAG DB0;Новый обработчик прерывания 09НNEWINT9:CLIPUSHAX; Сохранение используемых регистров; Вызов старого обработчикаPUSH ESPUSH DSPUSH CSPOPDS;PUSH AXPUSH BXPUSH CXPUSHFCALL CS:SAVEINT9; Вызов старого обработчикас возвратом;Запись в AX и AL кодов из буфера;MOV AX , 40H;MOV ES , AX;MOV BX , ES:1AH;MOV AX, ES:[BX]MOV AH, 1INT16HJZ PROD;Проверка расширенного кодаCMP AL , 0JEEXTCMP AH, 1DH; Для чистого CTRLJNE PRODMOV AH,00HINT 16HPROD:POP CXPOP BXPOP AXJMPEND9;Проверка нажатия F1EXT:CMP AH , 3BH ; Код F1JE PRINT1; Печать строкипо F1; Проверка выгрузкиCMP AH , 5EH; Нажата Ctrl + F1JNE PRODUNLD:; Выгрузка;;; 9Н; 2FHPUSH ESMOV DX,OFFSET REZMSG1CALL PRINTPOP ES; Вывод сообщение о завершении; резидентаPUSH DXPUSH ESmov AX,2509H; Восстановление обработчика прерывания 05Hlds DX,CS:SAVEINT9int 21Hmov AX,252DH; Восстановление обработчика прерывания 2FHlds DX,CS:SAVEINT2Dint 21H932010 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”; получим из PSP адpес собственного окpужения и выгpузим егоMOVES,CS:2CHMOVAH,49HINT21H; выгpузим тепеpь саму пpогpаммуPUSHCSPOPESMOVAH,49HINT21H; Код в AL для успешной выгрузкиMOV AH,00HINT 16H;POP ESPOP DXPOP CXPOP BXPOP AX;POP DSPOP ESPOP AXSTIIRET;Вывод цепочки F1PRINT1:PUSH ESMOV DX,OFFSET REZMSG2; Вывод сообщение о F1CALL PRINT;POP ES; Очистка буфера клавиатурыPUSH ESMOV AX , 40HMOV ES , AXMOV BX , ES:1AHMOV ES:1CH , BX;POP ESJMP PROD;END9:POP DSPOP ESPOP AXSTIIRET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;NEWINT2D PROC FARCLIPUSH DS;PUSH CSPOPDSCMP AH, 0EEh; собственный кодJE MY_OBRJMP OLD_OBR; Новый обработчикMY_OBR:CMP AL , 1 ; Проверка наличияJE EXIT_2FCMP AL, 2; ВыгрузкаJE UNLOAD;;;;;;;;;2010 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”EXIT_2F: MOV AL, 0FFH ; Есть в памятиSTIPOP DSIRET;UNLOAD:; Восстановление обработчиковPUSH CSPOPDSMOV DX,OFFSET REZMSG1CALL PRINT;94; Вывод сообщение о завершении; резидента;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PUSH DXPUSH ES; 9Н; 2FHmov AX,2509H; Восстановление обработчика прерывания 05Hlds DX,CS:SAVEINT9int 21Hmov AX,252DH; Восстановление обработчика прерывания 2FHlds DX,CS:SAVEINT2Dint 21H; получим из PSP адpес собственного окpужения и выгpузим егоMOVES,CS:2CHMOVAH,49HINT21H; выгpузим тепеpь саму пpогpаммуPUSHCSPOPESMOVAH,49HINT21H; Код в AL для успешной выгрузкиMOV AL, 0FFHPOP DXSTIPOP ESPOP DSIRETOLD_OBR:MOV AL, 0; наш резидент не установленSTIPOP DSJMPCS:SAVEINT2D; Вызов старого обработчикаNEWINT2D ENDP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Процедура печати строки для резидентной программы; т.к.
21Н(09H) нельзя; DX - adress string NEAR (DS - БАЗА);Конец строки - '$';PRINTPROCPUSH DIPUSH AXPUSH CXPUSH DXPUSH BXMOVDI,DX;Позиция курсора в началеMOVAH,03H2FH;2010 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”MOVBH,00HINT10HMOV95CX , 70; цикл вывода и проверки символов строкиLOOP1:MOVAL,DS:[DI]CMPAL,'$'; Конец строки для выводаJEFIN;Печать символа на экранINC DIMOVBH,0MOVAH,0AHPUSH CXMOVCX,0001HINT10HPOP CX; Новая позиция курсораNEXT4:MOVAH,02HINCDLMOVBH,00HINT10HJMPLOOP1; Конец цикла выводаFIN:POP BXPOP DXPOP CXPOP AXPOP DI; Восстановление стекаRETPRINTENDPREZMSG1 db 'TSR was unloaded (Ctrl+F1 - TSR part)!','$'REZMSG2 db 'TSR: F1 - pushed!!!', '$';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Часть инициализацииINIT:CLI; Запрет прерываний; Установка DSPUSH CSPOP DS; проверка параметровMOV AL ,CS:80HCMP AL, 0JNE INIT_UND; Есть параметры; Проверка в мамятиINIT1:PUSH CSPOP DSMOV AH, 0EEhMOV AL, 1; Проверка наличияINT 2DhCMP AL, 0FFhJNE INIT2; переход если резидент не(!) в памяти (на загрузку); Сообщение о том, что уже загруженMOV AH , 09HMOV DX, OFFSET MSG_INMEMINT21H; Выход из программыбез установки резидентаEXITTSR:MOV AL, 0MOV AH, 4CHSTIINT 21H962010 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”; Вызрузкаили справкаINIT_UND:; Есть параметры;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;разборка параметровMOV SI , OFFSET ( PSP + 81H)LODSB; первый пробелLODSBCMPAL , '/'JNEERR_PARLODSB; символ параметраCMPAL , 'H'JEINIT_HELPCMPAL , 'h'JEINIT_HELPCMPAL , 'U'JEINIT_UND1CMPAL , 'u'JEINIT_UND1JMP ERR_PAR; ВыгрузкарезидентаINIT_UND1:MOV AH , 0EEHMOV AL,2INT 2DhCMP AL , 0FFHJE INIT3;Сообщение о том что нет выгрузкиMOV AH , 09HMOV DX, OFFSET MSG_NOUNLDINT21HJMPEXITTSR; Сообщение о выгрузкеINIT3:MOV AH , 09HMOV DX, OFFSET MSG_UNLDINT21HJMPEXITTSR; СправкаINIT_HELP:MOV AH , 09HMOV DX, OFFSET MSG_HelpINT21HJMPEXITTSRERR_PAR:MOV AH , 09HMOV DX, OFFSET MSG_ParamINT21HJMPEXITTSR; Получение адреса старого обработчика9INIT2: MOVAH, 35HMOVAL, 09H; Номер прерыванияINT 21H; Сохранение адреса старого обработчикаMOVWORD PTR SAVEINT9 , BXMOVWORD PTR SAVEINT9+2 , ES; Установка нового обработчика в вектор прерыванияMOVAH,25HMOVAL, 09H; Номер прерыванияMOVDX, OFFSETNEWINT9INT21H; Получение адреса старого обработчика2FMOVAH, 35HMOVAL, 2DH; Номер прерывания9972010 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”INT 21H; Сохранение адреса старого обработчикаMOVWORD PTR SAVEINT2D , BXMOVWORD PTR SAVEINT2D +2 , ES; Установка нового обработчика в вектор прерывания2FMOVAH,25HMOVAL, 2DH; Номер прерыванияMOVDX, OFFSETNEWINT2DINT21H; Вывод сообщения о загрузке резидентаMOV AH , 09HMOV DX, OFFSET MSGINT21H; Завершить и оставить резидентной (TSR)MOVAX, 3100HMOVDX, (init - begin +10FH)/16; Размер резидентаSTI; Разрешение прерыванийINT21H; Данные части инициализацииMSGDB 'Start TSR program!', 10,13,'$'MSG_INMEM DB 'TSR already is in memory!', 10,13,'$'MSG_UNLD DB 'TSR was unloaded (Init part)!', 10,13,'$'MSG_NOUNLDDB 'TSR is NO in memory!', 10,13,'$'MSG_HelpDB 'Test - sample TSR - 2010', 10,13,'Parameters: /H or /h help , /U or /u - unload TSR ', 10,13,'€-д®а¬ жЁпя!',10,13,'$'; Последний текст "Информация" - введен в коде ASCII!!!MSG_ParamDB 'Error - command line parameters!', 10,13,'$'CODEPRENDSENDBEGINПосле компиляции и редактирования связей в формате .COM (см.
выше) получимисполнимый модуль TSRPOS.COM.Предварительно необходимо проверить размер свободной памяти и его запомнить:C:\work>mem…591664 максимальный размер исполняемой программы…При запуске этого модуля без параметров резидент будет загружен в оперативнуюпамять:C:\work>tsrposC:\work>Start TSR program!C:\work>_Повторный запуск исполнимого файла TSRPOS.COM приводить к выдаче сообщения на экран:C:\work>tsrposC:\work>TSR already is in memoryC:\work>_Проверка с помощью утилиты MEM должна показать наличие резидента и его окружения в памяти (напомню, что перед запуском резидента необходимо с помощью утилиты MEM проверить количество свободной памяти и его запомнить!):C:\work>mem /p…Адрес------000000000400Имя--------Размер-----000400000100Тип-----Вектор прерыванияОбласть обмена ПЗУ (ROM)00DE20COMMAND000510Данные……2010 год 2 курс 4-й семестр Большаков С.А.“Системное программирование”00E340COMMAND000B5000EEA0COMMAND0004F000F3A0TSRPOS00051000F8C0TSRPOS00026000FA30MEM00051000FF50MEM0174E098ПрограммаОкружениеОкружениеПрограммаОкружениеПрограмма589968 максимальный размер исполняемой программыПри запуске программы в режиме справки резидент не загружается и не удаляетсяиз памяти.