47 lines
1.7 KiB
C++
Executable File
47 lines
1.7 KiB
C++
Executable File
/* LAB6
|
||
Лабораторная работа по теме
|
||
"Программные прерывания"
|
||
|
||
|
||
При вызове функции - прерывания из СИ, используется INT.
|
||
В связи с этим стек заполняется несколько иначе.
|
||
В стеке сохраняются значения IP, СS (сегмент кода),от куда вызывается
|
||
прерывание, и флаги.
|
||
Выход из INT осуществляется с помощью IRet,которая вынимает из стека
|
||
все старые регистров CS, IP и флагов.
|
||
Так же при вызове прерывания,флажок прерывания i и t
|
||
устанавливается в 0, что запрещает вызов любых других прерываний,
|
||
а также запрещает трассировку.
|
||
*/
|
||
#include<stdio.h>
|
||
#include<dos.h>
|
||
#include<iostream.h>
|
||
#include <conio.h>
|
||
|
||
void interrupt (*old)(...); // здесь будем сохранять старый вектор
|
||
void interrupt cmp_int(...) // а это наш обработчик
|
||
{
|
||
cout<<"Прерывание ";
|
||
getch();
|
||
|
||
}
|
||
|
||
void main(void)
|
||
{ int aa;
|
||
aa=1;
|
||
old=getvect(0xf0);
|
||
disable();
|
||
setvect(0xf0,cmp_int);
|
||
enable();
|
||
// aa=aa/0;
|
||
geninterrupt(0xf0);
|
||
|
||
puts("v1=v2");
|
||
setvect(0xf0,old);
|
||
return;
|
||
// Задания
|
||
// 1 Напишите программу обработки прерывания
|
||
// 2 Вызовите прерывание путем организации особого случая
|
||
// 3 Покажите использование команды int3, определите ее код с испол. TD
|
||
}
|