Такая проблема: при переходе в защищенный режим из под ДОСа - процессор вырубается (просто перезагрузка). Делаю все как тов. Зубков прописал: 1.открываю адресную линию А20. (непосредственно к PM это отношения не имеет, пока мы не собираемся писать в адрес больше 0fffffh) in al,92h or al,2 out 92h,al 2.Вычисляем линейный адрес GDT (mov ax,SEG (любой загруженный сегмент) shl eax,4 add eax,offset GDT или же add ax,offset GDT (в зависимости от разрядности сегмента, где лежит GDT - TASM иначе плюется). 3.Формирую переменную с размером\адресом GDT. 4.Загружаю GDT (состоящую только из нулевого дескриптора - для начала). 5.Запрещаю прерывания.(cli) 6.Запрещаю немаскируемые прерывания (чего-такое - не до конца уяснил еще) in al,70h or al,80h out 70h,al 7.Ну, собственно, переходим в PM: mov eax,cr0 or al,1 mov cr0,eax ;Здесь происходит обрушение. jmp short next ;сбрасываем очередь предвыборки... next: ;OTHER CODE... Собственно вопрос: семптомом чего является такая глухая перезагрузка. Может кто сталкивался... Да, и где можно скачать нормальный САйс под ДОС. "Боже!!! Зачем тебе вручную PM, да еще сквозь ДОС?!" - спросите вы. Отвечаю - "просто из любопытства." "Вопрос ведет нас..."
Зачем айс под дос? Используй виртуалку, Bochs например. что обрушение происходит именно mov cr0,eax , маловероятно, обычно падает на jmp. Нужен не просто jmp short а межсегментный jmp, причём (32битный). формируется примерно так: db 66h ; префикс 32 битного кода db 0EAh ; опкод jmp dd 00000000h ; куда прыгать? dw 00001000b ; селектор "Вычисляем линейный адрес GDT" И куда ты его дальше деваешь? Так простовзял и посчитал Так что читай ещё раз доку...
Для инструкции загрузки GDT, необходимо сформировать переменную из 6 байт. Младшие 2 байта = размер GDT минус 1, а старшие 4 = линейный адрес GDT, которая будет загружаться и маска которой расположена в одном из сегментов нашей процедуры. Соответственно, получая линейный адрес, мы его записываем в старшие 4 байта переменной, которая будет загружена в регистр GDTR нструкцией LGDT. Физический адрес (просто спутал с линейным) считается так: сегментный адрес умножается на 16 (shl 4) (т.к. адресная шина 20-битная) и к нему прибавляется смещение внутри сегмента. "Виртуалка" - виртуальная машина?
Abnormal все примеры Зубкова в0 2м издании по крайней мере работоспособны, сам проверял в свое время. А ты лечше глянь, нет ли там у тебя в конфиге расширителей и мемеорумангеров прописаных
Код (Text): db 66h ; префикс 32 битного кода db 0EAh ; опкод jmp dd 00000000h ; куда прыгать? dw 00001000b ; селектор Лучше Так (Должен быть Стек) Код (Text): MOV AX,SELECTOR PUSH AX MOV EAX,OFFSET_PMCODE_START PUSH EAX RETF 2 Abnormal 7.Ну, собственно, переходим в PM: mov eax,cr0 or al,1 mov cr0,eax ;Здесь происходит обрушение. 1.Неправильно определенный дескрипторы 2.Неправильно инизиализированая GDT
извините, а himem // emm386 случаем в памяти не болтаются? привелигерованные операции подразумевают их отсутствие.