ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.04.2019

Просмотров: 5822

Скачиваний: 8

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

                        (мы к ним только обращались, но не удаляли из стека)

1)  mov SP,BP  ; восстановить SP

     pop BP       ; восстановление старого BP

Теперь на вершине стека адрес возврата и можем выполнять RET

2)  Очистить стек от параметров может основная программа  ADD SP,2*N

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

Можно воспользоваться параметром [число] команды RET.

Этот параметр задает число байтов, на которое очищается стек.

Замечание! Адрес возврата не учитывать, т.к. Ret считывает его до очистки стека.

Таким образом необходимо выполнить возврат из процедуры   RET  2*N

Итак, схема процедуры

            name   proc

                        push bp

                        mov bp,sp

                        . . .   ; mov ax,[bp+4]      ; [bp+6], . . .

                        mov sp,bp

                        pop bp

                        ret  2*n

            name   endp

14. Понятие аппаратного и программного прерывания.

Временное прекращение обработки программы процессором для выполнения затребованных действий называют прерыванием. Прерывания делят на аппаратные и программные.

Аппаратные прерывания возникают в результате подачи сигнала от какого-либоустройства компьютера (клавиатура, системный таймер, жесткий диск и т. д.). Так как аппаратные прерывания возникают в случайные моменты времени, то их иногда называют еще асинхронными.

Программные прерывания вызываются искусственно с помощью команды INT или ее аналогов (int3, into). Эти прерывания являются синхронными.

Аппаратные прерывания делятся на внутренние и внешние.

Внутренние аппаратные прерывания возникают внутри самого процессора, а для приема внешних у процессора есть два физических контакта NMI (NonMaskable Interrupt — немаскируемые прерывания) и INTR (INTerrupt Request — запрос прерывания) (рис. 6.2).

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

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

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

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


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

Перед тем как вызывать процедуру обработки прерывания процессор автоматически сохраняет в стеке регистры CS, IP и FLAGS\EFLAGS, чтобы прерванная программа после обработки прерывания смогла безболезненно продолжить свое выполнение. Регистры CS:IP содержат адрес команды, с которой необходимо начать выполнение после возврата из процедуры обработки прерывания, а FLAGS\EFLAGS — состояние флагов до момента передачи управления процедуре обработке прерывания. Если

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

Помните, ранее отмечалось, что если exe-программане использует стек, то его необходимо все равно задать. Теперь должно быть понятно, что стек используется при прерываниях, которые происходят при выполнении программы.

Разумеется, на разное прерывание нужно реагировать по-разному,т. е. для каждого типа прерывания должна быть своя процедура обработки прерывания.

В реальном режиме процессора допускается всего 256 источников прерываний, они нумеруются от 0 до 255. Для каждого прерывания существует уже готовая процедура обработки, и все эти процедуры включены в состав MS-DOS.

  1. Прерывания DOS и BIOS.

У программиста под MS-DOS существует три способа работы с устройствами:

1.Непосредственная работа на самом низком уровне с использованием портовввода-вывода.

2.С помощью вызова функций BIOS.

3.С помощью вызова функций DOS.

Функции BIOS и DOS при обращении к устройствам тоже работают с портами ввода вывода, но эта работа скрыта от программиста. Все, что нужно сделать программисту — это просто вызвать функцию и считать возвращаемый ею результат, а функция все сделает самостоятельно. Существуют тысячи различных функций BIOS и DOS (где взять их описание будет рассказано ниже).

Все функции BIOS и DOS вызываются с помощью программных прерываний (командой INT). Сейчас лишь стоит отметить, что в реальном режиме процессора существует всего 256 прерываний, они нумеруются от 0h до FFh (от 0 до 255 в десятичной нотации).

Функции MS-DOS используют всего 32 прерывания с номерами в диапазоне от 20h до 3Fh (с32-гопо63-ев десятичной нотации).

Функций BIOS используют диапазон прерываний с 10h по 1Fh (c 16-гопо31-ев десятичной нотации) и c 40h по 4Ah (с64-гопо74-ев десятичной нотации), а также прерывание под номером 5h.

Несмотря на то, что функции BIOS и DOS используют лишь небольшие диапазоны прерываний, с помощью этих прерываний можно вызвать тысячи различных функций.

Например, с помощью прерывания INT 21h можно вызывать несколько сотен различных функцийMS-DOS. Номер нужной функции обычно помещается в регистр AH перед вызовом прерывания. Кроме этого большинство функций требуют, чтобы в определенные регистры были помещены различные необходимые параметры (аргументы функции).


Например, вспомним, как мы вызывали функцию DOS 09h:

mov

ah,9

; номер функции 09h

mov

dx,offset message

; аргумент функции

int

21h

; вызываем прерывание 21h

После того как функция выполнит свою работу, некоторые регистры будут содержать возвращаемые значения. Результат работы большинства функций возвращается в регистр AL. Например, в результате успешного выполнения функции DOS 09h в регистре AL окажется значение 24h (код символа $).

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

Описание всех функций DOS и BIOS можно найти в каких-нибудь старых справочниках по программированию под MS-DOS,а также в интернете в знаменитом "листе прерываний Ральфа Брауна. Лист прерываний Ральфа Брауна содержит описания всех прерываний от 0 до 255 и соответственно всех функций DOS и BIOS, которые используют определенные прерывания, но эти описания на английском языке. Последняя версия листа прерываний Ральфа Брауна имеет номер 61 (Release 61) и по-видимому,этот лист обновляться уже не будет никогда.

  1. Назначение и использование различных прерываний и их функций.

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

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

Уровни приоритетов обозначаются сокращенно IRQ0-IRQ15.Аббревиатура IRQ происходит от английских слов Interrupt Request — запрос на прерывание. Самый высокий приоритет у IRQ 0, а самый низкий у IRQ 15. Физически, IRQ представляют собой отдельно проложенные линии (проводники) на материнской плате и соответствующие этим линиям контакты в интерфейсах устройств. Линии IRQ предназначены только для передачи запросов прерывания.

 Функции прерываний:

1.       определение наиболее приоритетного незамаскированного запроса на прерывание (если одновременно поступило несколько запросов);

2.       определение типа выбранного запроса;

3.       сохранение текущего состояния счетчика команд и регистра флагов;

4.       определение адреса обработчика прерывания по типу прерывания и передача управления первой команде этого обработчика;

5.       выполнение программы - обработчика прерывания;


6.       восстановление сохраненных значений счетчика команд и регистра флагов прерванной программы;

7.       продолжение выполнения прерванной программы.

Таблица 6.2. Аппаратные прерывания, расположенные в порядке убывания приоритета

Преры-

Номер

Адрес

Источник сигнала прерывания


вание

вектора

вектора

 


 

 

 

 


IRQ0

INT 8h

0000:0020h

прерывание системного таймера, вызывается 18,2


 

 

 

раза в секунду


 

 

 

 



 


 

 



 

 

 

 

Таблица 6.2. (окончание)


 

 

 

 

 


 

IRQ1

INT 9h

0000:0024h

прерывание от клавиатуры, вызывается при каждом


 

 

 

 

нажатии и отпускании клавиши


 

 

 

 

 


 

IRQ2

INT 0Ah

0000:0028h

к этому выходу подключается ведомый контроллер


 

 

 

 

(прерывания IRQ8-IRQ15)


 

 

 

 

 


 

IRQ8

INT 70h

0000:01C0h

прерывание от часов реального времени


 

 

 

 

 


 

IRQ9

INT 0Ah

0000:01C4h

прерывание обратного хода луча, вызывается


 

 

или

 

некоторыми адаптерами при обратном ходе луча


 

 

INT 71h

 

 

 


 

 

 

 

 


 

IRQ10

INT 72h

0000:01C8h

используется дополнительными устройствами


 

 

 

 

 


 

IRQ11

INT 73h

0000:01CCh

используется дополнительными устройствами


 

 

 

 

 


 

IRQ12

INT 74h

0000:01D0h

прерывание от мыши PS/2-типа


 

 

 

 

 


 

IRQ13

INT 02h

0000:01D4h

прерывание от математического сопроцессора. По


 

 

или

 

умолчанию это прерывание отключено как на FPU,


 

 

 

так и на контроллере прерываний


 

 

 

 


 

 

INT 75h

 

 

 


 

 

 

 

 


 

IRQ14

INT 76h

0000:01D8h

прерывание от первого IDE-контроллера"операция


 

 

 

 

завершена"


 

 

 

 

 


 

IRQ15

INT 77h

0000:01DCh

прерывание от второго IDE-контроллера"операция


 

 

 

 

завершена"


 

 

 

 

 


 

IRQ3

INT 0Bh

0000:002Ch

прерывание от последовательного порта COM2,


 

 

 

 

вызывается, если порт COM2 получил данные


 

 

 

 

 


 

IRQ4

INT 0Ch

0000:0030h

прерывание от последовательного порта COM1,


 

 

 

 

вызывается, если порт COM1 получил данные


 

 

 

 

 


 

IRQ5

INT 0Dh

0000:0034h

прерывание от параллельного порта LPT2


 

 

 

 

 


 

IRQ6

INT 0Eh

0000:0038h

прерывание от дисковода "операция завершена"


 

 

 

 

 


 

IRQ7

INT 0Fh

0000:003Ch

прерывание от параллельного порта LPT1


 

 

 

 

 

 


  1. Понятие вектора прерывания. Нахождение в памяти адреса вектора прерывания.

В реальном режиме процессора допускается всего 256 источников прерываний, они нумеруются от 0 до 255. Для каждого прерывания существует уже готовая процедура обработки, и все эти процедуры включены в состав MS-DOS.Адреса этих процедур размещены в так называемой таблице векторов прерываний, соответственно вектором прерывания называют адрес процедуры обработки прерывания. Таблица векторов прерываний размещается в первом килобайте оперативной памяти и занимает адреса от 00000h до 00400h. Каждый адрес в таблице занимает двойное слово (4 байта):1-еслово — это номер сегмента памяти, в котором находится соответствующая процедура обработки прерывания, а2-еслово — смещение внутри этого сегмента. Прерыванию с номером 0 соответствует адрес 0000:0000, прерыванию с номером 1 – 0000:0004 и т. д.

Таким образом, смещение по которому находится вектор с номером N в таблице векторов прерываний, определяется как 4*N, а полный размер таблицы векторов прерываний составляет 4*256=1024 байт (1 Кбайт).

Как используется вектора и таблица векторов прерываний? Когда возникает прерывание, процессор по номеру источника прерывания путем умножения на 4 определяет смещение в таблице векторов прерываний. Затем сохраняет в стеке регистры CS, IP и FLAGS\EFLAGS, о чем мы говорили выше, и помещает первое слово вектора в регистр ip, а второе слово в регистр CS, и передает управление по адресу CS:IP, — так передается управление на процедуру обработки прерывания. Процедура обработки прерывания во время своего выполнения также может быть прервана, например, поступлением запроса от более приоритетного прерывания.

Когда процедура обработки прерывания закончит свою работу, она должна возобновить работу прерванной программы. Для этого ей надо восстановить из стека сохраненные там ранее значения IP, CS и FLAGS\EFLAGS. Делается это с помощью команды IRET, которая не имеет операндов. Команда IRET так и называется "возврат из обработчика прерываний", она самостоятельно загружает из стека значения IP, CS и FLAGS. Поэтому командой IRET все процедуры обработки прерываний завершают свою работу.

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

  1. Использование векторов прерывания при добавлении, изменении, написании собственного прерывания. Изменение существующего прерывания. Написание собственного прерывания. Добавление в существующее прерывание.

Обработчик прерывания оформляется как обычная подпрограмма:

int_hook proc far

; тело обработчика iret

int_hook endp

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