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 представлена структурная схема контроллера.
Цель работы:
Исследование принципа программного управления микросхемы контроллера прерываний (ПКП) 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). Сложность работы в данном режиме обуславливается тем, что все процедуры обработки аппаратных прерываний должны быть повторно входимыми, т. к. за время их работы могут повторно возникнуть прерывания того же уровня.