- •Билет 2 (Проверка открытия exe файла)
- •Клава.Асм
- •Выводит хвост командной строки
- •Породитель процесса (par.Asm)
- •Порождаемый процесс
- •Билет 3 (сканер для лексем)
- •Билет 4 (построить грамматику с возведением в степень)
- •Билет 5 (преобразование для нисходящего разбора)
- •Билет 7 (представление массива и выведение формулы)
- •Билет 8 (хеш - функция)
- •Билет 6 (грамматика для if then else)
- •Билет 9(Построить таблицу идентификаторов)
- •Билет 10 (ка для сканера лексем)
- •Билет 11(грамматика для чисел)
- •Билет 13 (матрица предшествования для грамматики)
- •Билет 14(анализ грамматики для метода предшествования)
- •Билет 16 (Заголовок exe)
- •Билет 17(Структура диска ms-dos)
- •Билет 18 (Синтаксический анализ теория) не написано Билет 19 (Лексический анализ теория)
- •Требования к грамматике нисходящего метода
- •Семантические программы. Перевод инфиксной записи в польскую.
- •Тетрады
- •Хранение грамматики с использованием сети
- •Аппаратные прерывания
- •Представление многомерных массивов в памяти эвм
- •Свободные кластеры логического диска "а" (на всякий)
Тетрады
представляют собой запись операций в форме из четырех составляющих: <операция>(<операнд1>,<операнд2>,<результат>). Тетрады используются редко, так как требуют больше памяти для своего представления,чем триады, не отражают взаимосвязи операций и, кроме того, плохо отображаются в команды ассемблера и машинные коды, так как в наборах команд большинства современных машин нет операций с тремя операндами.
A+B*C–D
(*, B, C, T1)
(+, A, T1, T2)
(–, T2, D, T3)
T1, T2, T3 –временные переменные формируемые транслятором.
Важным свойством списка тетрад является то, что тетрады располагаются строго в соответствии с порядком в котором должны быть выполнены операторы при реализации программы. При этом оператор с одним операндом может быть представлен в виде тетрад. Некоторые элементы тетрад остаются пустыми: «–A» – изменение знака (–, A, , T1), «A:=B» – (:=, B, , A).
Аналогично вводят тетрады описывающие переходы программ.
(JML, <метка>, , )
(JM, <адрес>, , )
(<оператор>, <адрес>, <условие>, )
Пример: (JMP, <адрес>, R, ) – переход на адрес если R>0;
В случае тетрад под адресом понимается номер тетрад заданной в списке.
Фрагмент программы в тетрадной форме:
1: (–, I, J, T1)
2: (JMP, <6>, T1, )
3: (+, K, 1, T2)
4: (:=, T2, , K)
5: (JMP, <7>, , )
6: (JML, M1, , )
7: (*, B, K, T3)
8: (:=, T3, , A)
Триады
представляют собой запись операций в форме из трех составляющих: <операция>(<операнд1>,<операнд2>), при этом один или оба операнда могут быть ссылками на другую триаду в том случае, если в качестве операнда данной триады выступает результат выполнения другой триады. Поэтому триады при записи последовательно номеруют для удобства указания ссылок одних триад на другие. Например, выражение A := B*C + D - B*10, записанное в виде
триад будет иметь вид:
1) * ( B, C );
2) + ( ^1, D );
3) * ( B, 10 );
4) - ( ^2, ^3 );
5) := ( A, ^4 )
Хранение грамматики с использованием сети
Аппаратные прерывания
1. Уровни управления прерываниями
В микропроцессоре ix86 можно использовать два уровня управления аппаратными прерываниями.
1) Верхний уровень.
На этом уровне все маскируемые прерывания могут быть запрещены с помощью инструкции CLI и, соответственно, разрешены с помощью инструкции STI. Различают маскируемые и немаскируемые прерывания. Немаскируемые прерывания подаются на вход NMI микропроцессора, а маскируемые - на вход INTR;
2) Нижний уровень.
Управление прерываниями на этом уровне основано на использовании регистра масок IMR программируемого контроллера прерываний, отображенного на порт 21h, и регистр команд, отображенного на порт 20h программируемого контроллера прерываний.
Таблица 1. Соответствие битов в регистре масок контроллера прерываний источникам прерываний
Бит IMR |
Номер вектора |
Источник |
0 |
8 |
IRQ0 - прерывание таймера (18. 2 раза в сек) |
1 |
9 |
IRQ1-прерывание от клавиатуры |
2 |
Ah |
IRQ2 - используется для каскадирования |
3 |
70h |
IRQ8 - часы реального времени |
4 |
71h |
IRQ9 - контроллер EGA |
5 |
72h |
IRQ10 - зарезервировано |
6 |
73h |
IRQ11 - зарезервировано |
7 |
74h |
IRQ12 - зарезервировано |
8 |
75h |
IRQ13 - пр. от арифметического сопроцессора |
9 |
76h |
IRQ14 - жесткий диск |
10 |
77h |
IRQ15 - зарезервировано |
11 |
Bh |
IRQ3 - асинхронный порт COM2 |
12 |
Ch |
IRQ4 - асинхронный порт COM1 |
13 |
Dh |
IRQ5 - жесткий диск (XT) |
14 |
Eh |
IRQ6 - контроллер НГМД |
15 |
Fh |
IRQ7 - прерывание принтера |
С каждым прерыванием связано некоторое число, которое называется приоритетом. При одновременном запросе на прерывание нескольких устройств обслуживание получает более приоритетное, все остальные прерывания запоминаются в контроллере. Прерывание в вектор разрешено, если соответствующий бит регистра масок установлен в 0.
Пример маскирования прерываний:
MOV AL, MASK
OUT 21h, AL
;обязательно очистка IMR после выполнения
;задач приложением
MOV AL, 0
OUT 21h, AL
Процедура обработки прерывания должна иметь в своем составе инструкции для выдачи в контроллер прерываний команды EOI (End Of Interrupt). Код EOI - 20h. Эта команда заносится в регистр команд, адрес порта которого - 20h.
EOI EQU 20h
MOV AL, EOI ;пока в порт 20h не будет направлена ко-
OUT 20h, AL ;манда 20h, ПКП не обрабатывает других
;прерываний
IRET
Кроме регистра масок и команд в контроллере имеются регистры IRR - хранит состояние входов запросов на прерывание, ISR - хранит номер обслуживаемого в данный момент прерывания.
2. Программирование ПКП i8259
Программирования контроллера прерываний небходимо по ряду причин. К ним можно отнести:
§ Определение базового адреса в таблице прерываний для поступающих на обработку запросов
§ Каскадирование контроллеров прерываний
§ Изменение приоритетной дисциплины обслуживания.
3. Дополнительные обработчики прерываний
Если есть необходимость для создания дополнительного обработчика прерывания (например обработчик прерывания от клавиатуры09h), следует иметь ввиду следующее: дополнительный обработчик должен включаться в цепь существующих обработчиков с корректной передачей управления данных по цепи. В случае удаления обработчика из памяти необходимо предусматривать меры по восстановлению целостности цепи обработчиков. Структура обработчика прерываний определяется рядом факторов:
1) прерывание может быть аппаратное или программное (Int);
2) программа обработчика может быть резидентной или транзитной;
3) вектор прерывания может быть свободным или использоваться в системе. В случае, когда вектор используется системой, то вызов системного обработчика может осуществляться до работы дополнительного или после окончания работы дополнительного;
4) дополнительный обработчик может полностью заменить системный или пользоваться результатами его работы. Если обработчик входит в состав программы, то из него можно обращаться к любым полям данных программы. Когда обработчик оформляется в виде резидентной программы, в секции инициализации необходимо:
а) запомнить старый вектор прерывания. Это можно сделать с помощью системного вызова Int 21h Fn 35h;
б) переустановить вектор (Системный вызов Int 21h Fn 25h);
в) необходимо завершить программу с помощью TSR-выхода (Int 21h Fn 31h).
В рабочей секции обработчика прерывания необходимо сохранить все используемые регистры и восстановить их по возвращении из обработчика. На контекст обработчика (тело с привязкой к адресам, его среда) настроены только 2 регистра: CS и IP, поэтому передача управления
CALL DWORD PTR OLD_09
неправильна. Если вызов системного обработчика идет до работы дополнительного, то вызов системного необходимо организовать таким образом, чтобы последний обеспечивал возврат управления в точку вызова дополнительного. Такой вызов можно обеспечить стандартным способом с помощью команды CALL, имея в виду лишь то обстоятельство, что возврат из системного осуществляется с помощью IRET, которая извлекает из стека 3 компоненты, то есть при вызове эти 3 компоненты должны быть помещены в стек.
PUSH F
CALL DWORD PTR CS:OLD_09
Если вызов существующего обработчика производится после работы дополнительного, то это осуществляется так:
NEW_09:
JMP CS:OLD_09 ; выход из дополнительного обработчика
; здесь стек не затрагивается, поэтому возврат
;по цепочке осуществит системный обработчик.
4. Взаимодействие дополнительного и основного обработчиков
При создании обработчика прерывания необходимо иметь в виду то обстоятельство, что для данного вектора уже есть обработчик см. рис. 1.
Стандартным выходом из такой ситуации может быть создание для всех векторов обработчиков-заглушек, состоящих только из одной команды IRET. Приложение, которому необходимо создать обработчик прерывания должно проанализировать наличие заглушки для данного вектора. Дальнейшие действия приложения зависят от того, имеется ли заглушка или нет. Если заглушка установлена, то можно устанавливать собственный обработчик без дополнительных действий, предусмотрев восстановление заглушки перед окончанием работы приложения. Если же заглушка не установлена, то это может означать, что для этого вектора имеется обработчик прерывания и необходимо строить работу нового обработчика прерывания руководствуясь схемой взаимодействия существующего и создаваемого обработчиков прерываний представленной на рис.1.
|
|
|
|
5. Средства переустановки векторов прерывания
Для работы с таблицей векторов прерываний операционная система предоставляет два системных вызова.
1) Получить значение вектора прерывания по номеру - Int 21h Fn 35h.
Этот вызов имеет следующие входные и выходные параметры.
Вход |
AH |
035h |
|
AL |
Номер вектора прерывания |
Выход |
ES:BX |
SEG:OFFSET - адрес обработчика прерывания |
2) Установить вектор с номером n равным адресу обработчика прерывания.
Вход |
AH |
025h |
|
AL |
Номер вектора прерывания |
Выход |
DS:DX |
SEG:OFFSET - адрес устанавливаемого обработчика прерывания |
6. Пример обработчика прерывания.
; Получить адрес обработчика прерывания 08h
MOV AX, 03508H
INT 21h
MOV WORD PTR OLD_ 08, BX
MOV WORD PTR OLD_ 08+2, ES
. . .
OLD_08 DD ;
. . .
; Установить адрес нового обработчика в вектор 08h
MOV DX, SEG NEW_08
MOV DS, DX
MOV DS, OFFSET NEW_08
MOV AX, 02508h
INT 21h
