// v1_zad5.cpp // prevodjenje iz komandne linije: bcc -ms -Ic:\bc31\include -Lc:\bc31\lib v1_zad5.cpp #include #include struct PCB{ // pomeraj u odnosu na poc. adresu strukture unsigned pc; // +0 unsigned sp; // +2 unsigned bp; // +4 unsigned ax; // +6 unsigned bx; // +8 unsigned cx; // +10 unsigned dx; // +12 - izraženo u bajtovima unsigned* stack; }; PCB *p[3]; PCB* running; int nextThread; //makro #define dispatch(x) { \ nextThread = x; \ _dispatch(); \ } void _dispatch() { asm { push bx mov bx, running mov bx[6], ax // ax pop WORD PTR [bx+8] // bx mov bx[10], cx // cx mov bx[12], dx // dx pop WORD PTR [bx+4] // bp pop WORD PTR [bx] // pc mov bx[2], sp // sp } running=p[nextThread]; asm { mov bx, running mov sp, bx[2] // sp push WORD PTR [bx] // pc push WORD PTR [bx+4] // bp mov ax, [bx+6] // ax push WORD PTR [bx+8] mov cx, [bx+10] // cx mov dx, [bx+12] // dx pop bx // bx } } // funkcija koju izvrsava nit 1 void a() { for (int i = 0; i < 3; ++i) printf("U a() %d\n",i); asm mov ax, 7 dispatch(2); asm mov i, ax printf(" u a() ax = %d\n",i); for (i = 0; i < 3; ++i) printf("U a() %d\n",i); dispatch(2); } // funkcija koju izvrsava nit 2 void b() { for (int i = 0; i < 3; ++i) printf("U b() %d\n",i); asm mov ax, 2 dispatch(1); for (i = 0; i < 3; ++i) printf("U b() %d\n",i); dispatch(0); } void createThread(PCB *newPCB, void (*body)()) { unsigned* st = new unsigned[1024]; newPCB->pc = FP_OFF(body); // stek je sada prazan newPCB->sp = FP_OFF(st+1024); newPCB->bp = FP_OFF(st+1024); newPCB->stack = st; } void delete_all() { delete [] p[1]->stack; delete [] p[2]->stack; delete p[0]; delete p[1]; delete p[2]; } int main() { p[1] = new PCB(); createThread(p[1], a); printf("napravio a\n"); p[2] = new PCB(); createThread(p[2], b); printf("napravio b\n"); p[0] = new PCB(); running = p[0]; dispatch(1); printf("Kraj.\n"); delete_all(); return 0; }