Возможно кто-нибудь найдёт ошибку в следующем коде, который должен осуществлять перевод процессорв в защищённый режим. Объявления: GDTREG STRUC ;Global Description Table Register Limit DW ? ;лимит таблицы GDT OFFS DD ? ;биты 31-00 смещения таблицы GDT GDTREG ENDS GDI STRUC ;Global Description Item Limit15_00 DW ? ;биты 15-00 лимита сегмента Base15_00 DW ? ;биты 15-00 базы сегмента Base23_16 DB ? ;биты 23-16 базы сегмента ;флаги [7 - P - 7] [6 - DPL - 5] [4 - S - 4] [3 - TYPE - 0] ; P - 0 отсутствует, 1 присутствует; S - 0 системный, 1 код или данные Flags1 DB ? ;флаги [7 - G - 7] [6 - D/B - 6] [5 - O - 5] [4 - AVL - 4] [3 - Limit19_16 - 0] ; G - 0 в байтах, 1 в 4 Кб Flags2 DB ? Base31_24 DB ? ;биты 31-24 базы сегмента GDI ENDS Глобальная таблица дескрипторов: Null GDI <0h, 0h, 0h, 0h, 0h, 0h> hCode GDI <0FFFFh, 0h, 0h, 10011000b, 0h, 0h> hStack GDI <511, 0h, 0h, 92h, 0h, 0h> Регистр, описывающий глобальную таблицу дескрипторов: GDTR_GDTREG GDTREG <23, 0h> А вот и проблемный код: MOV EAX, CS SHL EAX, 04h MOV EBX, OFFSET hCode MOV [EBX].Base15_00, AX SHR EAX, 16 MOV [EBX].Base23_16, AL MOV [EBX].Base31_24, AH MOV EAX, CS SHL EAX, 04h ADD AX, OFFSET Null MOV EBX, OFFSET GDTR_GDTREG MOV DWORD PTR [EBX].OFFS, EAX LGDT FWORD PTR GDTR_GDTREG CLI ; запретить немаскируемое прерывание in al,70h ; индексный порт CMOS or al,80h ; установка бита 7 в нем запрещает NMI out 70h,аl ;Включение адресной линии A20: in al, 92h or al, 2 out 92h, al ;Обнуление регистра флагов: push byte 2 popf MOV EAX, CR0 OR AL, 1 MOV CR0, EAX Суть проблемы: После исполнения последней команды компьютер перезагружается. Где ошибка?
Ну, так я нахожу физический адрес сегмента кода, умнажая значение CS на 16, и добавляю смещение Null. А после MOV CR0, EAX у меня всё правильно.
Вот новые данные. Тут добавлены обработчики трёх основных прерываний и т. д. Смотрите файл. И что такое Bosh?
Понимаю, что уже надоел своим защищённым режимом, но у меня проблемы со стэком. Пробывал разные варианты. Десять раз проверял дескриптор. Но компьютер перезагружается, если я пытаюсь использовать стэк. Вот очередная версия файла. Заранее спасибо. _807047932__TLOADER.ASM
C0DiCK Перед меткой continue отсутствует use32, а в дескрипторе написано что код 32х-битный. Еще у тебя очень странно инициализируется ESP и дескриптор стека.
Я ничего не понял в принципе определения базы сегмента стека.( esp = (cs+1)*4 ? так что ли? база оказывается выше на параграф? а если CS=00FF то inc al = 0 и esp будет 0? и при первом же push переполнение?) И главное что я не понял - почему при таком определении ты уверен что смещение в esp после первого же push не будет ниже предела? У тебя предел 511, ниже база+предел ты опускаться не можешь, а у тебя вобще в esp база и ты опустишься ниже её при первом же push А если оно не будет выше - сразу же исключение и получим. Esp должно сразу устанавливаться на база + предел + размер желаемый IMHO. Причём базой не оффсет вычисляемый через кол. пар. в CS а тот же в параграфах на байты CS*4 + предел CS или лучше DS*4 + предел DS, вобщем тот который у тебя по схеме выше. Так вроде тоже можно будет esp = HighestSegReg*4+HighestSegSize+SSsegSize так думается. Предел можно HighestSegReg*4+HighestSegSize Тогда базу можно 0. Я так думаю. Где понимающие специалисты по PM недавно много тут было?
The Svin У него в дескрипторе стека написано Код (Text): hStack GDI <511, 0FFFFh, 0h, 10010<font color="red]1</font><!--color-->10b, 01000000b, 0h> то есть сегмент расширяется вниз, следовательно esp должен быть больше границы. Хоть инициализация ESP выглядит дико, но условие это выполнятеся. Но из-за отсутствия директивы use32, после перехода, пара команд MOV AX,10000b/MOV SS,AX интерпретируется процессором как MOV EAX,????????. соответственно в SS ничего не загружается, и он остаётся с границей в 64К и без "расширения вниз", а вот ESP уже указывает за пределы сегмента.
C0DiCK Нужно правильно директивы расставлять, в частности поставить перед continue USE32, или в дескрипторе кодового сегмента написать что код 16 битный. А то у тебя генерируемый код не соответствует его описанию в дескрипторе. А так же читать про стек, пока не наступит просветление 8)
Да, всё. Спасибо. Я учёл все недостатки. Всё работает. Теперь другое дело. Я тут решил побаловаться со страничной адресацей, а не получается. Посмотрите пожалуйста. _1464021672__TLOADER.ASM
Код (Text): ;заполнение каталога таблиц размещения страниц MOV EDI, 00000000h ;по адресу 1MB(100000h) Почему здесь в EDI загружается 0? В StrOut32 значение загружаемое в EDI не соответствует значению загружаемому в ES, нужно в EDI грузить 0.