|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
06.01.2010, 14:31 | #1 |
Регистрация: 18.06.2009
Сообщений: 4
|
jmp illegal descriptor type 0
Вот устал уже летать в догатках.. Почему при переходе в защищенный режим (программа запускается в DOSBOXe 0.72) при выполнение загрузки в сегментный регистр командой lgdt происходит ошибка и вылет?..
Есть догатки? |
06.01.2010, 14:40 | #2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
покажите как формируете сегменты
и также как переходите. (и я не уверен что досбокс справится) вам лучше Bochs подойдет(найти образ доса не трудно) Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
06.01.2010, 14:43 | #3 |
Регистрация: 18.06.2009
Сообщений: 4
|
.386p
RM_CODE segment para public 'CODE' use16 assume CS:RM_CODE,SS:RM_STACK @@start: ; очистка экрана: mov AX,3 int 10h ; открываем линию А20 (для 32-х битной адресации): in AL,92h or AL,2 out 92h,AL ; вычисляем линейный адрес метки ENTRY_POINT (точка входа в защищенный режим): xor EAX,EAX ; обнуляем регистра EAX mov AX,PM_CODE ; AX = номер сегмента PM_CODE shl EAX,4 ; EAX = линейный адрес PM_CODE add EAX,offset ENTRY_POINT ; EAX = линейный адрес ENTRY_POINT mov dword ptr ENTRY_OFF,EAX ; сохраняем его в переменной ; (кстати, подобный "трюк" называется SMC или Self Modyfing Code - самомодифицирующийся код) ; теперь надо вычислить линейный адрес GDT (для загрузки регистра GDTR): xor EAX,EAX mov AX,RM_CODE ; AX = номер сегмента RM_CODE shl EAX,4 ; EAX = линейный адрес RM_CODE add AX,offset GDT ; теперь EAX = линейный адрес GDT ; линейный адрес GDT кладем в заранее подготовленную переменную: mov dword ptr GDTR+2,EAX ; а подобный трюк назвать SMC уже нельзя, потому как по сути мы модифицируем данные ; собственно, загрузка регистра GDTR: lgdt fword ptr GDTR ; запрет маскируемых прерываний: cli ; запрет немаскируемых прерываний: in AL,70h or AL,80h out 70h,AL ; переключение в защищенный режим: mov EAX,CR0 or AL,1 mov CR0,EAX ; загрузить новый селектор в регистр CS db 66h ; префикс изменения разрядности операнда db 0EAh ; опкод команды JMP FAR ENTRY_OFF dd ? ; 32-битное смещение dw 00001000b ; селектор первого дескриптора (CODE_descr) ; ТАБЛИЦА ГЛОБАЛЬНЫХ ДЕСКРИПТОРОВ: GDT: ; нулевой дескриптор (обязательно должен присутствовать в GDT!): NULL_descr db 8 dup(0) CODE_descr db 0FFh,0FFh,00h,00h,00h,10011010b,110 01111b,00h DATA_descr db 0FFh,0FFh,00h,00h,00h,10010010b,110 01111b,00h VIDEO_descr db 0FFh,0FFh,00h,80h,0Bh,10010010b,010 00000b,00h GDT_size equ $-GDT ; размер GDT GDTR dw GDT_size-1 ; 16-битный лимит GDT dd ? ; здесь будет 32-битный линейный адрес GDT RM_CODE ends ; --------------------------------------------------------------------------------------------------------- ; СЕГМЕНТ СТЕКА (для Real Mode) ; --------------------------------------------------------------------------------------------------------- RM_STACK segment para stack 'STACK' use16 db 100h dup(?) ; 256 байт под стек - это даже много RM_STACK ends ; --------------------------------------------------------------------------------------------------------- ; СЕГМЕНТ КОДА (для Protected Mode) ; --------------------------------------------------------------------------------------------------------- PM_CODE segment para public 'CODE' use32 assume CS:PM_CODE,DS:PM_DATA ENTRY_POINT: ; загрузим сегментные регистры селекторами на соответствующие дескрипторы: mov AX,00010000b ; селектор на второй дескриптор (DATA_descr) mov DS,AX ; в DS его mov AX,00011000b ; селектор на третий дескриптор (VIDEO_descr) mov ES,AX ; а этого в ES xor SI,SI ; обнуляем SI mov SI,PM_DATA ; SI = номер сегмента PM_DATA shl ESI,4 ; ESI = линейный адрес сегмента PM_DATA add ESI,offset message ; ESI = линейный адрес строки message xor EDI,EDI ; EDI = позиция на экране (относительно 0B8000h) mov ECX,mes_len ; длина текста в ECX ; вывод на экран: rep movsb ; DS:ESI (наше сообщение) -> ES:EDI (видеопамять) jmp $ ; погружаемся в вечный цикл PM_CODE ends ; --------------------------------------------------------------------------------------------------------- ; СЕГМЕНТ ДАННЫХ (для Protected Mode) ; --------------------------------------------------------------------------------------------------------- PM_DATA segment para public 'DATA' use32 assume CS:PM_DATA ; сообщение, которое мы будем выводить на экран (оформим его в виде блока повторений irpc): message: irpc mes, db '&mes&',0Dh endm mes_len equ $-message ; длина в байтах PM_DATA ends ; --------------------------------------------------------------------------------------------------------- end @@start |
06.01.2010, 15:01 | #4 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
первое что вы должны сделать после включения защищенного режима это дальний прыжок в 32 битный код.
увидел вашу попытку дальнего прыжка...но только что это такое? Код:
Код:
могу кинуть 100% рабочий кусок как пример на NASMе(пример мой, тестил и на Bochs и на реальном компе) Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 06.01.2010 в 15:09. |
06.01.2010, 15:09 | #5 |
Регистрация: 18.06.2009
Сообщений: 4
|
Буду рад!) Можно сюда, а можно и на ящик den_vse@mail.ru
|
06.01.2010, 15:16 | #6 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Код:
особенно главу 9 Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 06.01.2010 в 15:18. |
06.01.2010, 15:30 | #7 |
Регистрация: 18.06.2009
Сообщений: 4
|
Спасибо за помощь! Буду раскладывать по полочкам=)
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
ошибка error C2043: illegal break | Ongi | Общие вопросы C/C++ | 7 | 04.01.2012 20:55 |
Illegal assignment | mmx358 | Паскаль, Turbo Pascal, PascalABC.NET | 7 | 08.08.2009 15:22 |
ERROR:Illegal indexing mode | IgorKr | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 1 | 13.12.2008 23:54 |
Ошибка(C++): error C2041: illegal digit '9' for base '8' | TheWanderer | Общие вопросы C/C++ | 4 | 02.10.2008 21:11 |
Illegal mix of collations | VasyaVasin | PHP | 1 | 27.12.2007 08:00 |