Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Переключение задач


Автор: uvsoft 21.11.2005, 20:43
ет тама собственного говоря копия аналогичной из раздела Си, но все же сдесь я думаю тоже найдется кому что сказать.... хоть что-то от чего можно оттолкнуться....

Hi,

может кто-нибудь сталкивался с проблемой переключения задач в Си? т.е. у меня есть напирмер три задачи каждая зациклено выводит свой определенный текст на экран, нужно чтобы по нажатию на определенную клавишу последовательно менялась текущая выполняемая задача... Соответственно необходимо использовать ассемблерные вставки... Ставлю свой собственный обработчик прерывания 9, проверяю нажата ли нужная клавиша... а дальше тупик... вроде бы для переключения задач нужно использовать IRET, перед этим загрузив в регистр TR селектор дискриптора из TSS нужной задачи..... но вот как это все сделать....

вообщем может кто имел с этим дело, отзовитесь!

спасиб

Код

#include <stdio.h>
#include <dos.h>
#include <conio.h>

#ifdef __cplusplus
    #define __CPPARGS ...
#else
    #define __CPPARGS
#endif

#define INTR 0x9

///////////////////////////////////////////////////////////////////////////////

void interrupt hKeyPress(__CPPARGS);

void interrupt (*hOld)  (__CPPARGS);

///////////////////////////////////////////////////////////////////////////////

int main(void) {

    clrscr();
    hOld = getvect(INTR);
    setvect(INTR, hKeyPress);
    getch();
    setvect(INTR, hOld);
    return  0;
}

///////////////////////////////////////////////////////////////////////////////

void interrupt hKeyPress(__CPPARGS) {
    char ch;
Circ:
    asm{
        push    ax
        in      ax, 60h     // Читаем ключ
        mov     ch, al
        pop     ax
        cmp     ch, 1h      // Esc?
        je      Old         // Да, выходим
        cmp     ch, 39h     // Space?
        je      Change      // Да, меняем задачу
        jmp     Continue
    }
Change:


Continue: 
    asm{
        in      al, 61h     // Берем занчение порта
        mov     ah, al      // Сохраняем его
        or      al, 80h     // Устанавливаем бит разрешения
        out     61h, al     // Выводим его в управляющий порт
        xchg    ah, al      // Извлекаем исходного значения порта
        out     61h, al     // Записываем его обратно
        mov     al, 20h     // Посылаем сигнал "Конец прерывания"
        out     20h, al     // контролеру прерываний 8259
        jmp     End
    }
Old:
    hOld();
End:
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)