ВУЗ:
Составители:
Рубрика:
Stack:=<F> - загружает в стек PSW (содержимое регистра флагов);
Stack:=<CS> - загружает в стек содержимое сегментного регистра
CS; Stack:=<IP> - загружает в стек текущий адрес, то есть адрес
следующей команды прерванной программы.
3) Начиная с адреса CS:EA, где CS = 0000, EA = 4×n — считывает
2 слова, (4 байта), первое (младшее) из которых попадает в IP, а
второе (старшее) — в CS.
Таким образом, следующая команда будет выбираться, начиная с
адреса CS:IP, который установило программное прерывание INT n .
Следовательно, в задачу пользователя входит:
а) знать, в каком сегменте и с какого адреса расположена
подпрограмма, которая вызывается прерыванием INT n;
б) загрузить в ячейки памяти в нулевом сегменте, начиная с EA =
4×n, слово адреса и слово сегмента начала подпрограммы.
Пример 1 – пусть подпрограмма должна вызываться прерыванием
INT 2F, и эта подпрограмма располагается в ОЗУ, начиная с адреса:
CS=1570, IP = 0100.
Ответ:
Вычисляем адрес вектора : EA = 2F×4=BC.
Располагаем адрес начала подпрограммы по адресу вектора:
IP CS
Адрес
00BC 00BD 00BE 00BF
Данные
00 01 70 15
Естественный вопрос: как вернуться из программного прерывания?
Команду безадресного перехода RET FAR здесь можно использовать, но
к ней необходимо добавлять команду POPF, чтоб восстановить и регистр
флагов F, и указатель стека. Такой возврат обеспечивается специальной
командой безадресного перехода, которая поглощает в себя эти две
команды:
а) Ассемблер: IRET;
б) КОП = CF.
Действие команды:
IP := <Stack> ;возврат адреса из стека;
CS := <Stack> ;возврат сегмента из стека;
F := <Stack> ;возврат флагов из стека.
Следовательно, если подпрограмма вызывается программным
прерыванием, а не командой CALL, то она должна заканчиваться
командой IRET.
Теперь снова вернемся к аппаратному прерыванию. Итак,
микропроцессор сигналом чтения -INTA требует у контроллера
прерываний КОП следующей команды. По всей видимости, это должна
быть команда программного прерывания INT n с кодом операции CD.
70
Stack:=- загружает в стек PSW (содержимое регистра флагов); Stack:= - загружает в стек содержимое сегментного регистра CS; Stack:= - загружает в стек текущий адрес, то есть адрес следующей команды прерванной программы. 3) Начиная с адреса CS:EA, где CS = 0000, EA = 4×n — считывает 2 слова, (4 байта), первое (младшее) из которых попадает в IP, а второе (старшее) — в CS. Таким образом, следующая команда будет выбираться, начиная с адреса CS:IP, который установило программное прерывание INT n . Следовательно, в задачу пользователя входит: а) знать, в каком сегменте и с какого адреса расположена подпрограмма, которая вызывается прерыванием INT n; б) загрузить в ячейки памяти в нулевом сегменте, начиная с EA = 4×n, слово адреса и слово сегмента начала подпрограммы. Пример 1 – пусть подпрограмма должна вызываться прерыванием INT 2F, и эта подпрограмма располагается в ОЗУ, начиная с адреса: CS=1570, IP = 0100. Ответ: Вычисляем адрес вектора : EA = 2F×4=BC. Располагаем адрес начала подпрограммы по адресу вектора: IP CS Адрес 00BC 00BD 00BE 00BF Данные 00 01 70 15 Естественный вопрос: как вернуться из программного прерывания? Команду безадресного перехода RET FAR здесь можно использовать, но к ней необходимо добавлять команду POPF, чтоб восстановить и регистр флагов F, и указатель стека. Такой возврат обеспечивается специальной командой безадресного перехода, которая поглощает в себя эти две команды: а) Ассемблер: IRET; б) КОП = CF. Действие команды: IP := ;возврат адреса из стека; CS := ;возврат сегмента из стека; F := ;возврат флагов из стека. Следовательно, если подпрограмма вызывается программным прерыванием, а не командой CALL, то она должна заканчиваться командой IRET. Теперь снова вернемся к аппаратному прерыванию. Итак, микропроцессор сигналом чтения -INTA требует у контроллера прерываний КОП следующей команды. По всей видимости, это должна быть команда программного прерывания INT n с кодом операции CD. 70
Страницы
- « первая
- ‹ предыдущая
- …
- 68
- 69
- 70
- 71
- 72
- …
- следующая ›
- последняя »
