#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <stdio.h>
#define stacksize (2048)
#define _stek unsigned int
typedef
struct Tdescr{
unsigned int ss,sp,bp,ds,si,di;
};
void huge t_add(Tdescr huge *proc,void huge* work);
void huge t_switch(Tdescr huge *procO,Tdescr huge *procN);
void huge work1(void);
void huge work2(void);
void huge work3(void);
Tdescr *proc1=(Tdescr * )malloc(sizeof(Tdescr));
Tdescr *proc2=(Tdescr * )malloc(sizeof(Tdescr));
Tdescr *proc3=(Tdescr * )malloc(sizeof(Tdescr));
Tdescrhuge *Main=(Tdescr * huge)malloc(sizeof(Tdescr));
voidhuge t_add(Tdescr huge *proc,void huge * work)
{
_stek huge *st=(_stek huge *)malloc(stacksize);
proc->ss=FP_SEG(st);
proc->sp=FP_OFF(st)+1000;
*(int huge *)MK_FP(proc->ss,proc->sp)=FP_OFF(work);
*(int huge *)MK_FP(proc->ss,proc->sp+2)=FP_SEG(work);
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],bp
mov es:[bx+6],ds
mov es:[bx+8],si
mov es:[bx+10],di
les bx,procN;
mov ax,es:[bx]
mov ss,ax
mov sp,es:[bx+2]
mov bp,es:[bx+4]
mov ds,es:[bx+6]
mov si,es:[bx+8]
mov di,es:[bx+10]
}
;
};
#include <conio.h>
#include <dos.h>
#include <stdio.h>
#define stacksize (2048)
#define _stek unsigned int
typedef
struct Tdescr{
unsigned int ss,sp,bp,ds,si,di;
};
void huge t_add(Tdescr huge *proc,void huge* work);
void huge t_switch(Tdescr huge *procO,Tdescr huge *procN);
void huge work1(void);
void huge work2(void);
void huge work3(void);
Tdescr *proc1=(Tdescr * )malloc(sizeof(Tdescr));
Tdescr *proc2=(Tdescr * )malloc(sizeof(Tdescr));
Tdescr *proc3=(Tdescr * )malloc(sizeof(Tdescr));
Tdescrhuge *Main=(Tdescr * huge)malloc(sizeof(Tdescr));
voidhuge t_add(Tdescr huge *proc,void huge * work)
{
_stek huge *st=(_stek huge *)malloc(stacksize);
proc->ss=FP_SEG(st);
proc->sp=FP_OFF(st)+1000;
*(int huge *)MK_FP(proc->ss,proc->sp)=FP_OFF(work);
*(int huge *)MK_FP(proc->ss,proc->sp+2)=FP_SEG(work);
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],bp
mov es:[bx+6],ds
mov es:[bx+8],si
mov es:[bx+10],di
les bx,procN;
mov ax,es:[bx]
mov ss,ax
mov sp,es:[bx+2]
mov bp,es:[bx+4]
mov ds,es:[bx+6]
mov si,es:[bx+8]
mov di,es:[bx+10]
}
;
};
остальные функции удалены
кто нибудь может объяснить работу функцииt_add ?? а так же t_switch
29 марта 2010 в 6:03
t_switch
на переключение задач похоже
сохраняются регистры некоторые, странно, что только некоторые
а потом такие же регистры загружаются из другого сохранённого состояния
28 марта 2010 в 20:05
t_switch загружает некоторые регистры в procO и присваивает этим регистрам значения полей структуры procN.
А t_add, кажись, создает новый стек.
28 марта 2010 в 20:04
аццкий код=)
t_add что то делает с памятью, навскидку выделяет память в куче и говорит что это "память стека" для proc
t_switchтворит нечто аццкое, но как мне кажется, она выгружает программу procO, и загружает procN.
ЗЫ, это все более чем предположения
28 марта 2010 в 20:04
на wasm.ru спроси