Смекни!
smekni.com

Программирование контроллера приоритетных прерываний (стр. 5 из 8)

mov dx, mas[si]

min1: loop maxi

;вывод максимального

mov ah, 02h

int 21h

pop cx

loop s1t

mov ax, 04c00h

int 21h

end main

Процедуры. Макрокоманды

Процедура, часто называемая подпрограммой, - это правильным образом оформленная совокупность команд, которая будучи однократно описана, при необходимости может быть вызвана в любом месте программы. Процедура представляет собой группу команд для решения конкретной подзадачи и обладает средствами получения управления из точки вызова задачи более высокого уровня и возврата управления в эту точку. В простейшем случае программа может состоять из одной процедуры.

Описание процедуры может размещается в любом месте программы, но таким образом чтобы на нее случайным образом не попало управление:

- в начале программы, до первой исполняемой команды;

- в конце, после команды возвращающей управление операционной системе;

- промежуточный вариант, тело процедуры располагается внутри другой процедуры или основной программы. В этом случае необходимо предусмотреть обход процедуры командой jmp;

- в другом модуле.

Синтаксис описания процедуры:

Имя_процедуры PROC заголовок

Команды, директивы тело процедуры

[ret] возврат из процедуры

[имя_процедуры] ENDP конец процедуры

Вызов процедуры осуществляется командой

CALL [модификатор] имя_процедуры

Команда call передает управление по адресу с символическим адресом имя_процедуры, с сохранением в стеке адреса возврата, команды следующей после команды call.

Возврат из процедуры осуществляется по команде

RET [число]

Команда ret считывает адрес возврата из стека и загружает его в регистры cs и ip/eip, возвращая таким образом управление команде, следующей за командой call. Число – необязательный параметр, обозначающий количество элементов, удаляемых из стека при возврате из процедуры. Размер элемента зависит от используемой модели сегментации 32 или 16 разрядной.

Передача аргументов из/в процедуру может осуществляться через регистры, переменные или стек.

Пример.

Model small.stack 100h.data w db 25 dup (?).codevvod procmov ah, 0ahlea dx, wint 21hretvvod endpmain: …Call schetCall vvod…exit:mov ax,4c00hint 21hschet proc..retschet endpend main

Макрокоманда является одним из многих механизмов замены текста программы. С помощью макрокоманды в текст программы можно вставлять последовательности строк и привязывать их к месту вставки. Макрокоманда представляет собой строку, содержащую некоторое имя – имя макрокоманды, предназначенное для того, чтобы быть замещенным одной или несколькими другими строками при трансляции.

Для работы с макрокомандой вначале необходимо задать ее шаблон-описание, так называемое макроопределение.

Имя_макрокоманды MACRO [список_формальных_аргументов]

<Тело макроопределения>

ENDM

Существует три варианта расположения макроопределений:

- в начале исходного текста программы до сегмента кода и данных с тем, чтобы не ухудшать читабельность программы. В данном случае макрокоманды будут актуальны только в пределах этой программы;

- в отдельном файле. Для того, чтобы использовать эти макроопределения в других программах, необходимо в начале исходного текста этих программ записать директиву

include имя_файла

- в макробиблиотеке. Макробиблиотека создается в том случае, когда написанные макросы используются практически во всех программах. Подключается библиотека директивой include. Недостаток этого и предыдущего методов в том, что в исходный текст программы включаются абсолютно все макроопределения. Для исправления ситуации можно использовать директиву purge, в качестве операндов которой перечисляются макрокоманды, которые не должны включаться в текст программы.

Includemacrobibl.inc ;в исходный текст программы будут вставлены строки из macrobibl.inc

Purgeoutstr, exit ;за исключением макроопределений outstr, exit

Активизация макроса осуществляется следующим образом:

Имя_макрокоманды список_ фактических_ аргументов

Model smallVivod macro rgMov dl, rgMov ah, 02hInt 21hendm.data...code..vivod al.. Model smallsravnenie macro rg, metcmp rg , ‘a’ja metadd rg, 07hmet: add rg, 30hendm.data...code..sravnenie al, m1..

Функционально макроопределения похожи на процедуры. Сходство их в том, что и те, и другие достаточно один раз где-то описать, а затем вызывать их специальным образом. На этом их сходство заканчивается, и начинаются различия, которые в зависимости от целевой установки можно рассматривать и как достоинства и как недостатки:

- в отличие от процедуры, текст которой неизменен, макроопределение в процессе макрогенерации может меняться в соответствии с набором фактических параметров. При этом коррекции могут подвергаться как операнды команд, так и сами команды. Процедуры в этом отношении объекты менее гибки;

- при каждом вызове макрокоманды ее текст в виде макрорасширения вставляется в программу. При вызове процедуры микропроцессор осуществляет передачу управления на начало процедуры, находящейся в некоторой области памяти в одном экземпляре. Код в этом случае получается более компактным, хотя быстродействие несколько снижается за счет необходимости осуществления переходов.

Пример 17. Найти максимальный элементы в каждой строке массива 5*7, с использованием процедур

model small

.stack 100h

.data

mas dw 5 dup( 7 dup(0))

max dw 0

subj db ‘введитестроку',13,10,'$'

.code

;процедура ввода строки

vvod_strproc

mov ah, 09h

lea dx, subj

int 21h

mov cx, 07h

mov ah, 01h

outcykl: int 21h

mov mas[si], ax

inc si

inc si

loop outcykl

ret

vvod_strendp

;процедура поиска максимального в строке

poick­_­maxi proc

mov cx, 06h

mov dx, mas[si]

maxi: add si, 2

cmpdx, mas[si]

ja min1 ;если меньше то переходим

mov dx, mas[si]

min1: loop maxi

ret

poick­_­maxi endp

mainproc

mov ax, @data

mov ds, ax

xorsi, si ;заполнение массива

movcx, 05h

incykl: pushcx

callvvod_str ;вызов процедуры по вводу строки

popcx

loopincykl

;поиск максимального/ минимального в строках

xor si,si

mov cx, 05h

s1t: pushcx

callpoick­_­maxi ;вызов процедуры поиска максимального элемента

movah, 02h ;вывод максимального

int 21h

pop cx

loop s1t

mov ax, 04c00h

int 21h

endр main


Программирование контроллера приоритетных прерываний

Для организации обработки аппаратных прерываний в вычислительных системах применяется программируемый контроллер прерываний, выполненный в виде специальной микросхемы i8259А, отечественный аналог микросхема КР580ВМ59. Эта микросхема может обрабатывать запросы от восьми источников внешних прерываний. В стандартной конфигурации вычислительных систем используют две последовательно соединенные микросхемы i8259А.

Функции микросхемы ПКП:

- фиксирование запросов на обработку прерывания от восьми источников, формирование единого запроса на прерывание и подача его на вход INTR микропроцессора;

- формирование номера вектора прерывания и выдача его на шину данных;

- организация приоритетной обработки прерываний;

- запрещение (маскирование) прерываний с определенными номерами.

На рис.1 представлена структурная схема контроллера.


Рис.1. Структурная схема ПКПП.

Программирование контроллера приоритетных прерываний

Цель работы:

Исследование принципа программного управления микросхемы контроллера прерываний (ПКП) i8259А с помощью ПК, исследование различных режимов работы ПКП

Микросхема i8259A имеет два состояния:

- состояние настройки параметров обслуживания прерываний, во время которого путем посылки в определенном порядке так называемых управляющих слов производится инициализация контроллера;

- состояние работы — это обычное состояние контроллера, в котором производится фиксация запросов на прерывание и формирование управляющей информации для микропроцессора в соответствии с параметрами настройки.

Возможность программирования контроллера позволяет достаточно гибко изменять алгоритмы обработки аппаратных прерываний.

В процессе загрузки компьютера и в дальнейшем во время работы контроллер прерываний настраивается на работу в одном из шести режимов:

1.Режимфиксированныхприоритетов (Fixed Priority, Fully Nested Mode).

В этом режиме контроллер находится сразу после инициализации. Запросы прерываний имеют жесткие приоритеты от 0 до 7 (0 - высший) и обрабатываются в соответствии с приоритетами. Прерывание с меньшим приоритетом никогда не будет обработано, если в процессе обработки прерываний с более высокими приоритетами постоянно возникают запросы на эти прерывания.

2. Автоматический сдвиг приоритетов (Automatic Rotation). Режим циклической обработки прерываний.

В этом режиме дается возможность обработать прерывания всех уровней без их дискриминации. Например, после обработки прерывания уровня 4 ему автоматически присваивается низший приоритет, при этом приоритеты для всех остальных уровней циклически сдвигаются и прерывания уровня 5 будут иметь в данной ситуации высший приоритет и, следовательно, возможность быть обработанными.

3. Программно-управляемый сдвиг приоритетов (Specific Rotation).

Программист может сам передать команду циклического сдвига приоритетов ПКП, задав соответствующее управляющее слово. В команде задается номер уровня, которому требуется присвоить максимальный приоритет. После выполнения такой команды устройство работает так же, как и в режиме фиксированных приоритетов, с учетом их сдвига. Приоритеты сдвигаются циклически, таким образом если максимальный приоритет был назначен уровню 3, то уровень 2 получит минимальный и будет обрабатываться последним.

4 Автоматическое завершение обработки прерывания (Automatic End Of Interrupt, AEOI).

В обычном режиме работы процедура обработки аппаратного прерывания должна перед своим завершением очистить свой бит в ISR специальной командой, иначе новые прерывания не будут обрабатываться ПКП. В режиме AEOI нужный бит в ISR автоматически сбрасывается в тот момент, когда начинается обработка прерывания нужной процедурой обработки и от нее не требуется издавать команду завершения обработки прерывания (EOI). Сложность работы в данном режиме обуславливается тем, что все процедуры обработки аппаратных прерываний должны быть повторно входимыми, т. к. за время их работы могут повторно возникнуть прерывания того же уровня.