Привет всем! Почему то не удается сделать программное прерывание в виде задачи. Подскажите где мог ошибиться. Значит так, данные у меня расположены по сегментному адресу 2000h, код для РМ расположен по сегментному адресу 3000h. mov ax, 2000h ; настроим сегментные регистры на данные mov ds, ax mov es, ax ; DS = ES = 2000H, аппаратные и немаск прерывния выключены mov eax, 20000h ; настроим GDT, вычисляется физ. адрес GDT add ax, offset ds:Zero_descriptor ; прибавляется к физ.адрeсу смещение в сег. данных mov ds:LA_GDT, eax ; сохр. физ. адреса GDT mov eax, 20000h ; вычислим физ адр. сегмента TSS_0 add ax, offset tss_0 ; добавим смещение mov word ptr ds:TSS_0_descriptor+2, ax shr eax, 16 mov byte ptr ds:TSS_0_descriptor+4, al mov eax, 20000h ; вычислим физ адр. сегмента TSS_INT49 add ax, offset tss_INT49 ; добавим смещение mov word ptr ds:TSS_INT49_descriptor+2, ax shr eax, 16 mov byte ptr ds:TSS_INT49_descriptor+4, al lgdt fword ptr ds:Lim_GDT ; загрузка GDTR mov eax, 20000h ; инициализация таблицы IDT add ax, offset Gate_descriptor0 ; добавим смещение mov ds:LA_IDT, eax ; сохранение физ. адреса IDT xor eax, eax ; настройка смещений шлюзов mov eax, 30000h ; в сегменте 3000h находится обработчик add eax, offset int_30h ; добавим смещение mov word ptr ds:Gate_descriptor48, ax shr eax, 16 mov word ptr ds:Gate_descriptor48+6, ax lidt fword ptr ds:Lim_IDT ; IDTR ; тут включается РМ и тождественное странич преобразование и прыжок на код РМ вот то что по сегментному адресу 2000h, таблица тождествен преобразования находится по сегментному адресу 4000h. ; GDT Zero_descriptor db 8 dup (0) Code_descriptor db 0FFh, 0FFh, 0, 0, 0, 10011000b, 11001111b, 0 ; 8 Data_descriptor db 0FFh, 0FFh, 0, 0, 0, 10010010b, 11001111b, 0 ; 16 TSS_0_descriptor db 067h, 0, 0, 0, 0, 10001001b, 0, 0 ; 24 TSS_INT49_descriptor db 067h, 0, 0, 0, 0, 10001001b, 0, 0 ; 32 size_GDT = $-Zero_descriptor-1 ; размер GDT Lim_GDT dw size_GDT ; операнды команды LGDT LA_GDT dd 0 ; IDT Gate_descriptor0 db 34*8 dup (0) ; дескрипторы 0 - 33 Gate_descriptor34 db 14*8 dup (0) ; дескрипторы 34 - 47 Gate_descriptor48 db 0h, 0h, 08h, 0h, 0h, 11101110b, 0h, 0h ; Программное прерывание INT 30h Gate_descriptor49 db 0h, 0h, 32, 0h, 0h, 11100101b, 0h, 0h ; Программное прерывание INT 31h size_IDT = $-Gate_descriptor0-1 ; размер IDT Lim_IDT dw size_IDT ; операнды команды LIDT LA_IDT dd 0 tss_0 db 68h dup (0) ; сегмент контекста задачи №0 ; сегмент контекста задачи tss_INT49 dd 0 ; back link dd 0; ESP0 dd 0 ; SS0 dd 0 ; ESP1 dd 0 ; SS1 dd 0 ; ESP2 dd 0 ; SS2 dd 40000h ; CR3 dd 30000h + offset Start_INT49 ; EIP dd 0 ; EFLAGS dd 0 ; EAX dd 0 ; ECX dd 0 ; EDX dd 0 ; EBX dd 6F000h ; ESP dd 0 ; EBP dd 0 ; ESI dd 0 ; EDI dd 16 ; ES dd 8 ; CS dd 16 ; SS dd 16 ; DS dd 0 ; FS dd 0 ; GS dd 0 ; LDTR dd 0 ; T вот код РМ. mov ax, 16 ; flat mov es, ax mov ds, ax mov ss, ax mov esp, 70000h mov ax, 24 ; загружаем селектор дескриптора задачи в регистр TR ltr ax mov eax, 1 ; работает, он оформлен как шлюз прерывания int 30h int 31h ; вот с этим проблема начинается, он оформлен как шлюз задачи ; до сюда не доходит mov es:[0b8000h], 02020202h jmp $ Start_INT49: iret jmp Start_INT49 Вроде дал все самое необходимое, если кто делал подобное, может увидит ошибку? Потому что я делал такое, но сейчас оно почему то не работает! Получается когда вызываю int 31h то вход в обработчик получается (проверял), а выхода не получается, где то оно там "уходит". Спасибо за внимание
0136 А зря. Хороший эмулятор, особенно последняя версия 2.4 вообще прям. Хотя, конечно, не без багов, но все же лучше, чем гадать. А принципиальность такая - это всегда плохо для кодера. Попробовал бы в бошсе сначала отладить, а потом уже спрашивал
та блин, мне влом им пользоваться, и я не кодер, я просто любитель, я ведь говорил - кто делал подобное, если никто не видит, то нафиг советы тут радавать, советчики блин.
Ты совет спросил - получи. "Я знач не кодер, я любитель" - и вывалил простыню кода. Ты в смысле сам не понимаешь что там написано? Ты упрямо копаешь не туда, сказали же - юзай Bochs, че там пользоваться-то? грузанулся с образа, поставил бряк куда нужно, и смотри за регистрами себе. Если ты и дальше будешь копать PM, что отладчик ускорит процесс раза в три как минимум. И если уж попытался описать проблему, то сделал бы это понятно, а то какой-то "сегментный" адрес, нету тела прерывания (тебе же оно нужно?). Код посмотрел, имхо трабла в запуске многозадачности, войти-то но входит, а вот выйти уже не знает куда. Сейчас всего не помню, но что-то мне подсказывает, что что-то ты не сохранил перед переходом в другую задачу. Да и при взгляде на селекторы мне как-то не по себе. Советую взять какое-нибудь руководство по PM, и аккуратно проштудировать код построчечно. Еще неплохо бы разобраться отдельно. Сначала сделай пару задач без всяких прерываний, как разбершься, просто сделаешь задачу прерыванием. Ну тада и ассемблером не пользуйся, а то мало ли чего намутит. Бери интел маны, и хексом вводи, может к старости закончишь. А, то есть пользоваться в лом, хочешь чтобы тебя просто носом ткнули в ошибку, кому на тебя время тратить-то нужно? Гадать без отладчика не в лом? А это не принципиальность, это лень. Не будем ее поощрять, тебе совет дали - чего еще нужно?
Такое некультурное поведение на этом форуме не поощряется. Либо ты исправляешься, либо тема отправляется куда подальше, а своими проблемами тебе придется разбираться самому, а попутно думать о том, как общаться с другими людьми.
Я думал есть профи, который сразу скажет в чем дело. Это ведь обычное дело, все просто. И это, как бабы ведете себя не дуйтесь, но так и есть - обидили скажем дружно - нафиг нужно деффачки тчк
_220 - "Не будем ее поощрять, тебе совет дали - чего еще нужно?" - чего нужно было - читай с самого начала.
Great - задумайся сам о себе, нефиг дуться на правду, я сказал мне влом, значит мне влом. не высмактывай из пальца. исправлять, поучать дома будешь. и без твоих высказываний делаю сам.
0136, задумайся сам о себе, нефиг дуться на правду: ты пришёл сюда, и начинаешь что-то требовать. Тебе предлагают решения, ты говоришь мне влом, дайте другое. А когда тебе объясняют, что ты неправ, ты начинаешь исправлять и поучать окружающих. Хочешь я за тебя загружу твой код в bochs и найду там ошибку? Я могу, надо лишь о цене договориться.