// v1_zad4.cpp // prevodjenje iz komandne linije: bcc -ms -Ic:\bc31\include -Lc:\bc31\lib v1_zad4.cpp #include #include struct PCB{ unsigned sp; unsigned* stack; }; PCB *p[3]; PCB* running; int nextThread; //makro #define dispatch(x) { \ nextThread = x; \ _dispatch(); \ } void _dispatch(){ asm { // Cuva registre na steku. push ax // Sta bi se desilo da ne cuvamo AX? push bx push cx push dx mov bx, running // upisuje adresu mem. lok. mov [bx], sp // cuva sp } running = p[nextThread]; asm { mov bx, running mov sp, [bx] // restauira sp pop dx // restauira podatke pop cx pop bx pop ax } } // 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]; unsigned newPC = FP_OFF(body); st[1023] = newPC; // upisuje se rec - int // pocetni kontekst //(proizvoljne vrednosti) // st[1023-1018] = {PC,BP,AX…DX} newPCB->sp = FP_OFF(st+1018); 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; }