タイマハンドラ呼び出し部分(NASM)
asmTimerHandler: _asmTimerHandler: PUSHAD CALL timerHandler POPAD IRETD
タスクを切り替えてる部分
void timerHandler(){ int* stack; asm ("mov %%ebp, %0 \n" : "=g"(stack)); //今,動いているタスクのレジスタの保存 taskData[currentTask].eax = stack[9]; taskData[currentTask].ecx = stack[8]; taskData[currentTask].edx = stack[7]; taskData[currentTask].ebx = stack[6]; taskData[currentTask].esp2 = stack[5]; taskData[currentTask].ebp = stack[4]; taskData[currentTask].esi = stack[3]; taskData[currentTask].edi = stack[2]; taskData[currentTask].cs = stack[11]; taskData[currentTask].eflags = stack[12]; taskData[currentTask].esp = stack[13]; taskData[currentTask].eip = stack[10]; //ここでタスク切り替え currentTask = (currentTask + 1) % taskCount; stack[10] = taskData[currentTask].eip; //これから動かすタスクのデータをレジスタに保存 stack[9] = taskData[currentTask].eax; stack[8] = taskData[currentTask].ecx; stack[7] = taskData[currentTask].edx; stack[6] = taskData[currentTask].ebx; stack[5] = taskData[currentTask].esp2; stack[4] = taskData[currentTask].ebp; stack[3] = taskData[currentTask].esi; stack[2] = taskData[currentTask].edi; stack[11] = taskData[currentTask].cs; stack[12] = taskData[currentTask].eflags; stack[13] = taskData[currentTask].esp; IO::writePort8(PIC0_OCW2, 0x60); }