Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переключение задач, IRET TSS TR 
:(
    Опции темы
uvsoft
  Дата 21.11.2005, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 4.2.2003

Репутация: нет
Всего: нет



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

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:
}

--------------------
Старый глюк лучше новых двух.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0358 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.