Доброго времени суток to all Нарисовалась интересная проблема в защищенном режиме - не работает бесконечный цикл. Идея в том, чтобы после перехода в защищенный режим подождать пока на клаве не будет нажата клавиша tab, например. Используютьса порты ввода-вывода. Вот код: Code (Text): ;----------------------------------------- in al,92h or al,02h out 92h,al cli in al,70h or al,80h out 70h,al ;Jump to PM mov eax,cr0 or al,1 mov cr0,eax ;----------------------------------------- ;Мы уже в защищенном. Теперь ждем кнопку: wait4Key: in al,60h cmp al,0fh ;Скан-код tab jne wait4Key В vmware етот кусок вылетает с сообщением о переполнении стека ("Virtual machine kernel stack fault"). Если закомментировать jne wait4Key, все работает нормально, правда кнопку никто ждать не собираетьса В реальном режиме такое ожидание работает, а в PM-нет 8-/ .
ОК, вот весь код: Code (Text): ;Ето загрузочный сектор. Загружает второй сектор, который ;переводит проц в PM format binary use16 org 7c00h Titan_Entry: jmp start ;--------------------- MS-DOS table ---------------- ; Всякая инфа о файловой системе ;----------------end of MS-DOS table ---------------- start: mov ah,00h mov al,03h int 10h ;Setting display mode 80x25 with 16 colors ;---------------------------------------------------- ;Loading second sector module. It will jump to PM ;---------------------------------------------------- mov ah,02h mov al,01h mov ch,00h mov cl,02h xor dx,dx mov bx,7e00h int 13h ;---------------------------------------------------- ;Jumping there ;---------------------------------------------------- call 7e00h ;---------------------------------------------------- ;Halting processor ;---------------------------------------------------- cpuid ;Ну, типа ждем пока все команды исполнятьса cli hlt ;---------------------------------------------------- ;Some data... ;---------------------------------------------------- NitroText db 'Nitro loader. Welcome!',00h ;Далее идет тот самый второй сектор, переводящий проц в РМ ;********************************************************* format binary use16 org 7e00h start: push 0b800h pop ds ;Чтоб к видеопамяти можно было достучатьса через ds ;---------------- in al,92h or al,02h ;Включаем А20 out 92h,al cli in al,70h ;Вырубаем немаскируемые прерывания or al,80h out 70h,al mov eax,cr0 or al,1 mov cr0,eax ;Переводим проц в PM in al,70h and al,07fh ;Разрешаем прерывания out 70h,al sti ;---------------- wait4Key: in al,60h cmp al,0fh ;Скан-код tab jne wait4Key ret Вот и все пироги.
А IDT инициализировать, обработчики прерываний писать? Это где-то есть, просто пропущено, или этого нет вообще?
Если закомментировать cli, то все работает нормально, без сорванного стека. Наверное когда он заходит в бесконечній цикл, идут разніе прерівания ну от таймера и т.д. А так как я ни одного прерівания не настроил, то стек и слетает. Вроде так.
Code (Text): or al,1 mov cr0,eax ;Переводим проц в PM in al,70h Ты этот код сам придумал? Тогда посмотри в книжке как делается переход в PM (где-то jmp потерялся)
zStorm Да, я тоже так предположил Folk Acid Код правильный. Хуже того, он даже работает. jmp нужен для перезагрузки CS нормальным селектором сегмента кода, тут это пока не требуется. Вот когда нужно будет прерывания обрабатывать, тогда да.