マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

マルチタスクが進まない

hdkさんに「特権レベル0だけで回ってるときはESPが切り替わっていない」と指摘されたので、ESPを書き換えるように変更したつもりだったけど、うまくいっていない。ESPを書き換えるタイミングが違うのかな?

ESPを書き換えるNASMのソース

asmSetESP:
_asmSetESP:
    MOV ESP, [ESP + 4]
    RET

タイマ割り込みのときに呼び出される関数

void timerHandler(){
    int* stack;

    asm volatile("mov %%ebp, %0 \n" : "=g"(stack));

    g_TimerManager->tick();

    taskData[currentTask].eax    = stack[11];
    taskData[currentTask].ecx    = stack[10];
    taskData[currentTask].edx    = stack[9];
    taskData[currentTask].ebx    = stack[8];
    taskData[currentTask].esp2   = stack[7];
    taskData[currentTask].ebp    = stack[6];
    taskData[currentTask].esi    = stack[5];
    taskData[currentTask].edi    = stack[4];
    taskData[currentTask].ds     = stack[3];
    taskData[currentTask].es     = stack[2];

    taskData[currentTask].cs     = stack[13];
    taskData[currentTask].eflags = stack[14];

    if((taskData[currentTask].cs & 3) > 0)
        taskData[currentTask].esp = stack[15];
    else
        taskData[currentTask].esp = stack[7];

    taskData[currentTask].eip = stack[12];
    currentTask = (currentTask + 1) % taskCount;

    stack[12] = taskData[currentTask].eip;

    stack[11] = taskData[currentTask].eax;
    stack[10] = taskData[currentTask].ecx;
    stack[9] = taskData[currentTask].edx;
    stack[8] = taskData[currentTask].ebx;
    stack[7] = taskData[currentTask].esp2;
    stack[6] = taskData[currentTask].ebp;
    stack[5] = taskData[currentTask].esi;
    stack[4] = taskData[currentTask].edi;
    stack[3] = taskData[currentTask].ds;
    stack[2] = taskData[currentTask].es;

    stack[13] = taskData[currentTask].cs;
    stack[14] = taskData[currentTask].eflags;

    if((taskData[currentTask].cs & 3) > 0){
        stack[15] = taskData[currentTask].esp;
        stack[16] = taskData[currentTask].ss;
    }else{
        asmSetESP(taskData[currentTask].esp);
    }

    IO::writePort8(PIC0_OCW2, 0x60);

    return;
}