Студопедия

КАТЕГОРИИ:


Архитектура-(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; Просмотров: 340; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.02 сек.