ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.04.2019
Просмотров: 5819
Скачиваний: 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.
-
Прерывания 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) и по-видимому,этот лист обновляться уже не будет никогда.
-
Назначение и использование различных прерываний и их функций.
Прерывание используется для быстрой реакции процессора на особые ситуации, возникающие при выполнении программы и взаимодействии с внешними устройствами.
Маскируемые прерывания делятся по уровням приоритетов. При одновременном поступлении нескольких запросов на прерывание, всегда обрабатывается прерывание с максимальным приоритетом. Если во время обработки прерывания приходит еще один запрос на прерывание с меньшим приоритетом, то он становится в очередь, а если с большим, то текущее прерывание само прерывается и ожидает, пока не будет обработано прерывание с более высоким уровнем приоритета.
Уровни приоритетов обозначаются сокращенно 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 |
|||||||
|
|
|
|
|
|
|
|
||||||
-
Понятие вектора прерывания. Нахождение в памяти адреса вектора прерывания.
В реальном режиме процессора допускается всего 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 все процедуры обработки прерываний завершают свою работу.
После возвращения из обработчика прерывания прерванная программа продолжит свою работу так, как будто и не было никакого прерывания.
-
Использование векторов прерывания при добавлении, изменении, написании собственного прерывания. Изменение существующего прерывания. Написание собственного прерывания. Добавление в существующее прерывание.
Обработчик прерывания оформляется как обычная подпрограмма:
int_hook proc far
; тело обработчика iret
int_hook endp
После того как обработчик написан, его можно привязать к номеру прерывания. Это можно сделать, записав адрес обработчика в таблицу векторов прерываний. Однако перед этим следует сохранить адрес предыдущего обработчика (который мы заменяем) чтобы по окончании работы программы можно было его восстановить, — это необходимо для того, чтобы не нарушить нормальную работу системы.