КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Особенности программирования. 5.1.1. Для чтения вектора прерывания и для изменения таблицы
5.1. На языке Турбо-Паскаль. 5.1.1. Для чтения вектора прерывания и для изменения таблицы векторов прерываний используйте предопределенный массив MemW. Нап- ример, для чтения смещения вектора 9 можно применить выражение ofs_:= MemW[0000:4*9]; а для записи сегмента адреса обработчика прерываний в $60-й вектор прерываний - Memw[0000:4*$60+2]:=Seg(Int9d); где: ofs_:word - переменная для временного хранения значения смещения; Int9d - имя процедуры обработки (коррекции) прерывания 9. 5.1.2. Для запрещения и разрешения прерываний используйте ли- бо команды на ассемблере: begin ..... asm Cli {прерывания запрещены} end ..... asm Sti {прерывания разрешены} end ...... либо операторы Inline с машинными командами: begin ..... Inline($fa) { Cli } ...... Inline($fb) { Sti } ...... Inlin 5.1.3. Для вызова программ обработки заданного прерывания ис- пользуется процедура Intr. Процедура Intr имеет следующую форму: Intr(IntNo: byte; var Reg: Registers), где:IntNo - номер прерывания (0...255), Reg - запись типа Registers, определенного в модуле DOS, со- держащая значения регистров процессора. Надо указать в программе модуль DOS после uses или включить в программу следующее описание типа записи: type Registers = record case integer of 0:(AX, BX, CX, DX, BP, SI, DI, DS, ES, Flags: word); 1:(AL, AH, BL, BH, CL, CH, DL, DH: byte); end; где: AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags,AL,AH,BL,BH,CL, CH,DL,DH - переменные, соответствующие одноименным регистрам процессора. При выполнении программного прерывания (выполнении процедуры Intr) процедура Intr загружает регистры AX, BX, CX, DX, BP, SI, DI, DS и ES процессора значениями из записи Regs (задаются пользо- вателем). Когда обработка прерывания завершается, содержимое ре- гистров AX, BX, CX, DX, BP, SI, DI, DS, ES и Flags возвращается в запись Regs. Ограничения: Программные прерывания, которые зависят от опре- деленных значений в SP или SS на входе или изменяют значения SP или SS на выходе, не могут быть выполнены с помощью этой процеду- ры. 5.1.4. Собственная процедура обработки прерываний имеет сле- дующий вид: procedure NewIntr(Flags, CS, IP, AX, BX, CX, DX, SI, DI, DS, ES, BP: Word); Interrupt; begin ... end. Примечание: -имя процедуры задается пользователем; -любое число параметров (в том числе и все) в процедуре можно опускать, но только подряд начиная с начала. Вызов пользовательской процедуры обработки прерывания осу- ществляется с помощью процедуры Intr (см. п. 5.1.2). Предваритель- но адрес процедуры пользователя должен быть занесен в таблицу век- торов прерывания в соответствии с выбранным номером прерывания либо путем прямой записи (см. п. 5.1.1), либо с помощью процедуры SetIntVec (см. п. 5.1.5), а адрес системной процедуры обработки данного прерывания сохранен либо в переменной (см. п. 5.1.1), либо с помощью процедуры GetIntVec (см. п. 5.1.4). 5.1.5. Процедура GetIntVec возвращает адрес заданного вектора прерывания и имеет следующий вид: GetIntVec(IntNo:byte; var Vector:pointer), где:IntNo задает номер прерывания (0...255) и адрес возвраща- ется в параметре Vector). 5.1.6. Процедура SetIntVec устанавливает заданный вектор пре- рывания по заданному адресу и имеет следующий вид: SetIntVec(IntNo:byte; Vector:pointer), где:IntNo задает номер прерывания (0...255) и Vector задает адрес (при задании адреса можно воспользоваться оператором @ или функцией Addr). 5.1.7. Чтобы сделать программу резидентной, т.е. такой, кото- рая постояно находилась бы в оперативной памяти (все программы об- работки прерывания должны быть такие), необходимо использовать в конце программы процедуру Keep(0), которая завершает программу и оставляет ее в памяти (параметр в процедуре указывает значение ко- да возврата). Поскольку программа остается в памяти, включая сегмент дан- ных, сегмент стека и "кучу", необходимо перед программой указать директиву компилятора, минимизирующую резидентную область памяти: {$m $800,0,0}. 5.2. На языке Турбо-Си. 5.2.1. Для чтения вектора прерывания и для изменения таблицы векторов прерываний используйте дальние указатели(сhar far *). Нап- ример, для установки указателей на вектора 9 и 60 можно применить выражение char far * adr_p,int9_p; adr_p= (char far *)(4*9); int9_p= (char far *)(4*60); а для записи адреса обработчика 9 прерываний в 60-й вектор прерываний - * int9_p=* adr_p; 5.2.2. Для вызова программ обработки заданного прерывания ис- пользуется процедура geninterrupt(IntNo), где:IntNo - номер прерывания (0...255). Надо указать в программе подключение библиотеки директивой #include <dos.h> 5.2.3. Собственная процедура обработки прерываний должна быть обработана специальным модификатором Турбо-Си interrupt,который ав- томатически сохраняет значения всех регистров и восстанавливает их перед возвратом управления вызывающей программе.При этом использу- ется для возврата управления команда IRET вместо обычной команды RET. Собственная процедура обработки прерываний должна быть описана как: void interrupt New_intr(); Тогда при вызове автоматически определяется ее начальный адрес, которому присваивается значение указателя * adr_p=(char far *)New_intr; 5.2.4. Чтобы сделать программу резидентной, т.е. такой, которая постояно находилась бы в оперативной памяти (все программы обработ- ки прерывания должны быть такие), необходимо использовать в конце программы функцию 31H прерывания 21H,кототорая завершает программу и оставляет ее в памяти резидентной. union REGS in,out; in.h.ah=0x31;/*задание 31H функции завершить и оставить резидентной в регистер ah*/ in.h.al=0;/*код возврата*/ in.x.dx=size;/*обьем выделенной памяти в 16_байтных параграфах */ int86(0x21,&in,&out);/*обрашение к 21 прерыванию с параметрами*/ 6. Индивидуальные задания 6.1. Осуществить коррекцию прерывания Int 9 (от клавиатуры) так, чтобы: а) выполнялись все действия системного обработчика данного прерывания; б) при нажатии одной из клавиш-переключателей вывести на эк- ран название этой клавиши. 6.2. Клавишу-переключатель выбрать по следующему правилу: нк:= нс mod 8,
где:нк - номер клавиши-переключателя в табл. 1; нс - номер студента в журнале. 7. Содержание отчета 7.1. Тема лабораторной работы. 7.2. Цель работы. 7.3. Индивидуальное задание. 7.4. Текст программы. 7.5. Результаты работы программы.
Дата добавления: 2014-12-07; Просмотров: 359; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |