Добавил:
Andrew1992
Факультет ИКСС, группа ИКВТ-61
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:LAB / _2017-ЛАБОРАТОРНЫЕ РАБОТЫ 2 КУРС / программы на С+ / F_LAB2
.CPP#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <stdio.h>
#define stacksize (2048)
#define _stek unsigned int
#define intr 0x08
const int num_pr=3;
typedef
struct Tdescr{
unsigned int ss,sp,si,di,bp,ds,cx,dx,bx,ax,fl,es;
};
#ifdef __cplusplus
#define __CPPARGS...
#else
#define __CPPARGS
#endif
void huge t_add(Tdescr huge *proc,void huge* task);
void huge t_switch(Tdescr huge *procO,Tdescr huge *procN);
void huge set_disp(void);
void huge stop_disp(void);
void interrupt (*old_han)(__CPPARGS);
void interrupt _handler(__CPPARGS);
void huge task1(void);
void huge task2(void);
void huge task3(void);
Tdescr *proc1=(Tdescr * )malloc(sizeof(Tdescr));
Tdescr *proc2=(Tdescr * )malloc(sizeof(Tdescr));
Tdescr *proc3=(Tdescr * )malloc(sizeof(Tdescr));
Tdescr huge *Main=(Tdescr * huge)malloc(sizeof(Tdescr));
unsigned int count,flag;
void main(void)
{
clrscr();
t_add(proc1,task1);
t_add(proc2,task2);
t_add(proc3,task3);
count=-1;
set_disp();
free (proc1);
free (proc2);
free (proc3);
}
void huge t_add(Tdescr huge *proc,void huge * task)
{
_stek huge *st=(_stek huge *)malloc(2*stacksize);
proc->ss=FP_SEG(st);
proc->sp=FP_OFF(st)+1000;
*(int huge *)MK_FP(proc->ss,proc->sp)=FP_OFF(task);
*(int huge *)MK_FP(proc->ss,proc->sp+2)=FP_SEG(task);
proc->es=_ES;
proc->fl=_FLAGS;
proc->sp-=8;
}
void huge t_switch(Tdescr huge *procO,Tdescr huge *procN)
{
asm {
les bx,procO;
mov es:[bx],ss
mov es:[bx+2],sp
mov es:[bx+4],si
mov es:[bx+6],di
mov es:[bx+8],cx
mov es:[bx+10],dx
mov es:[bx+12],bx
mov es:[bx+14],ax
pop ax
}
// procO->fl=_FLAGS;
// procO->es=_AX;
asm{
les bx,procN;
mov ax,es:[bx]
mov ss,ax
mov sp,es:[bx+2]
mov si,es:[bx+4]
mov di,es:[bx+6]
mov cx,es:[bx+8]
mov dx,es:[bx+10]
mov bx,es:[bx+12]
mov di,es:[bx+14]
}
// _FLAGS=procN->fl;
// _ES=procN->es;
};
void huge task1(void)
{ // clrscr();
int i=1;
int j=0;
enable();
while(j<1){
i++;
// disable();
gotoxy(3,i);
cprintf(" 1Proc= %i \n\r ",i);
// enable();
delay(10);
}
}
void huge task2(void)
{
int i=0;
int j=0;
enable();
while(j<1){
i++; i++;
// disable();
gotoxy(30,i);
cprintf("2Proc=%i \n\r ",i);
// enable();
delay(10);
}
}
void huge task3(void)
{ int i=0;
int j=0;
// enable();
while(j<1){
i++;
// disable();
gotoxy(60,i);
cprintf("3Proc=%i \n\",i);
enable();
delay(30);
}
}
//------------------------------------------------------------------------
// § ЇгбвЁвм ¤ЁбЇҐвзҐа
//--------------------------------------------------------------------------}
void huge set_disp(void)
{ disable();
old_han=getvect(intr);
setvect(intr,_handler);
t_switch(Main,proc1);
}
//------------------------------------------------------------------------
// ®бв ®ўЁвм ¤ЁбЇҐвзҐа
//--------------------------------------------------------------------------}
void huge stop_disp(void)
{ // disable();
setvect(intr,old_han);
t_switch(proc2,Main);
// enable();
}
//;------------------------------------------------------------------------
void interrupt _handler(__CPPARGS)
{ asm cli;
old_han();
// asm int 61h
count++;
flag=(count % num_pr);
switch(flag){
case 0: t_switch(proc1,proc2);
if(kbhit()) {
getch();
stop_disp();
}
break;
case 1: t_switch(proc2,proc3);
if(kbhit()) {
getch();
stop_disp();
}
break;
case 2: t_switch(proc3,proc1);
if(kbhit()) {
getch();
stop_disp();
}
break;
}
asm{
mov al, 20h
out 20h,al
}
asm sti;
}
Соседние файлы в папке программы на С+