Help! pmode(З/Р)
Выкинул ВСЕ, остался не скелет, а только позвоночник... - все равно не работает.
Перезагружается.
Заранее спасибо!
Вот текст:
main:
sta:
JMP REALSTART
label GDTR pword
GDTLIM DW gdtsize-1
GDTADR DD 10000h
label IDTR pword
IDTLIM DW idtsize-1
IDTADR DW idt
DW 7h
GDT:
NULLGDT:
times 8 DB 0
CODES:
DW codesize-1
ADR1 DW 0
ADR2 DB 7h
DB 9Ah
DB 00000000b
DB 0
STK:
DW 49
DW STKDW
DB 7
DB 96h
DW 0
gdtsize=$-GDT
idt:
DW EXCDUMMY
DW 08h
DB 0
DB 8Fh
DW 0
DW EXCDUMMY
DW 08h
DB 0
DB 8Fh
DW 0
DW EXCDUMMY
DW 08h
DB 0
DB 8Fh
DW 0
DW EXCDUMMY
DW 08h
DB 0
DB 8Fh
DW 0
DW EXCDUMMY
DW 08h
DB 0
DB 8Fh
DW 0
DW EXCDUMMY
DW 08h
DB 0
DB 8Fh
DW 0
DW EXCDUMMY
DW 08h
DB 0
DB 8Fh
DW 0
DW EXCDUMMY
DW 08h
DB 0
DB 8Fh
DW 0
DW EXCDUMMY
DW 08h
DB 0
DB 8Fh
DW 0
DW EXCDUMMY
DW 08h
DB 0
DB 8Fh
DW 0
DW EXCDUMMY
DW 08h
DB 0
DB 8Fh
DW 0
DW EXCDUMMY
DW 08h
DB 0
DB 8Fh
DW 0
DW EXCDUMMY
DW 08h
DB 0
DB 8Fh
DW 0
DW EXCDUMMY
DW 08h
DB 0
DB 8Fh
DW 0
DW EXCDUMMY
DW 08h
DB 0
DB 8Fh
DW 0
DW EXCDUMMY
DW 08h
DB 0
DB 8Fh
DW 0
DW EXCDUMMY
DW 08h
DB 0
DB 8Fh
DW 0
DW EXCDUMMY
DW 08h
DB 0
DB 8Fh
DW 0
idtsize=$-idt
STKDW:
times 50 DB 0
stksize=$-STKDW
REALSTART:
mov ax,REALSTART-2
mov sp,ax
push cs
pop ds
push ds
pop es
CLI
LGDT [CS:GDTR]
LIDT [CS:IDTR]
MOV EAX,CR0
OR EAX,1
MOV CR0,EAX
DB 0EAh
DW CONTINUE
DW 8
CONTINUE:
USE16
MOV AX,16
MOV SS,AX
MOV SP,48
MOV DX,3F2h ;Отключ. мотора флоп.
MOV AL,00001000b OUT DX,AL
JMP CONT2
CONT2:
JMP CONT2
EXCDUMMY:
mov sp,48
JMP CONT2
codesize=$-sta
>DW CONTINUE
>DW 8
Что это ещё за бред? Во первых перед дальним jmp должен стоять префикс 66h для того, чтобы использовать традцатидвухбитное смещение, а у тебя оно какое? Вместо DW CONTINUE должен стоять DD со смещением относительно базы сегмента, 458752, как указано в дескрипторе сегмента кода, селектор которого действительно 8.
db 66h
db 0EAh
dd CodeSegOffset
dw 8
где CodeSegOffset - смещение относительго базы сегмента кода.
>DB 0EAh
>DW CONTINUE
>DW 8
Что это ещё за бред? Во первых перед дальним jmp должен стоять префикс 66h для того, чтобы использовать традцатидвухбитное смещение, а у тебя оно какое? Вместо DW CONTINUE должен стоять DD со смещением относительно базы сегмента, 458752, как указано в дескрипторе сегмента кода, селектор которого действительно 8.
db 66h
db 0EAh
dd CodeSegOffset
dw 8
где CodeSegOffset - смещение относительго базы сегмента кода.
Почти все правильно, только надо не 66h, а 67h. Т.к. 66h - это кажить префикс разрядности регистров, а 67h - префикс разрядности операнда.
Да конечно, с наступающим всех!!!
Да, ещё забыл - ЗАЧЕМ ТАМ НУЖНА IDT, КОГДА КОМАНДОЙ CLI ЗАПРЕЩЕНЫ ПРЕРЫВАНИЯ!?
А исключения как же?
Кстати, видел рабочий пример, где far jmp как у меня, и все работает. К тому же у меня, пока с исключениями не работал, все с этим переходом было в норме. Кстати, странно, но в MenuetOS используется near jmp, и все работает!?
С Наступающим!
Так ведь?
А вообще бросай на пару дней всё это дело и встречай новый год!
Для перехода в защищённый режим нужен 32-разрядный переход, можно использовать jmp far, call far, и iret. Сомневаюсь, чтобы с ближним jmp сработало, т.к. он не меняет регистр cs. А насчёт префикса - на wasm.ru в статье про переход в защищённый режим используется префикс 66h, а не 67h.
А вообще бросай на пару дней всё это дело и встречай новый год!
Я знаю, что нужен дальний переход.
стянул из MenuetOS: (ошибся насчет near, глаза разбежались:))
jmp pword 8:CONTINUE, все равно не работает!
С Новым Годом!
Отключаюсь, конец связи...
пип...пип...пип...п
---
Вроде как база сегмента кода - 458752, а CONTINUE - смещение относительно старого сегмента кода из реального режима, в итоге конечный адрес перехода - не метка CONTINUE, а полный ОТСТОЙ! А адрес этой метки надо высчитывать заранее.
Теперь по поводу ближнего jmp в menuet, видимо там значение сегментного регистра cs в реальном режиме совпадает в селектором сегмента кода в защищённом режиме, поэтому и работает.
Ну что, с наступившим!!!
При корректном написании просто необходимо использовать далиний переход, т.е. ОБЯЗАТЕЛЬНО командами jmp far, call far, iretd, retf - какой больше нравится, независимо из какого в какой сегмент перебегать (32\16). Мне кажется, что вы не до конца знакомы именно с теоретической частью переключения из защ. режима в реальный и наоборот. Все сегментные регистры (cs, ds, es, ss и т.д.) содержат в себе еще и т.н. теневую часть, которая появилась в 286 процессоре. Суть ее в том, что при записи номера дескриптора в сегментный регистр, в теневую часть грузится сам дескриптор. Далее процессор пользуется именно этой теневой частью. Т.е. мы можем загрузить в сегментные регистры нужные нам селекторы, удалить GDT и все будет работать, пока мы не попытаемся загрузить в сегментный регистр чего-нить еще. Поэтому даже если значения селектора и сегмента совпадают, то при переходе из реального режима в защищенный все равно НЕОБХОДИМО использовать дальний переход, чтобы загрузить теневую часть!!!
Именно из-за этой теневой части родился на свет нереальный режим, когда мы сбросили бит зажищенного режима в CR0, но не перезагрузили сегментные регистры.
Далее, может и без разницы 66h или 67h, но при корректном написании необходимо использовать 67h. Даже, например, под дебагером (щас я имею в виду TD) смотрим код с 66h и 67h, то в первом случае он эту команду дизассемблирует неверно, а во втором все правильно.
Всех с Наступившим!!! Пить надо меньше, надо меньше пить....
При корректном написании просто необходимо использовать далиний переход, т.е. ОБЯЗАТЕЛЬНО командами jmp far, call far, iretd, retf - какой больше нравится, независимо из какого в какой сегмент перебегать (32\16). Мне кажется, что вы не до конца знакомы именно с теоретической частью переключения из защ. режима в реальный и наоборот. Все сегментные регистры (cs, ds, es, ss и т.д.) содержат в себе еще и т.н. теневую часть, которая появилась в 286 процессоре. Суть ее в том, что при записи номера дескриптора в сегментный регистр, в теневую часть грузится сам дескриптор. Далее процессор пользуется именно этой теневой частью. Т.е. мы можем загрузить в сегментные регистры нужные нам селекторы, удалить GDT и все будет работать, пока мы не попытаемся загрузить в сегментный регистр чего-нить еще. Поэтому даже если значения селектора и сегмента совпадают, то при переходе из реального режима в защищенный все равно НЕОБХОДИМО использовать дальний переход, чтобы загрузить теневую часть!!!
Именно из-за этой теневой части родился на свет нереальный режим, когда мы сбросили бит зажищенного режима в CR0, но не перезагрузили сегментные регистры.
Далее, может и без разницы 66h или 67h, но при корректном написании необходимо использовать 67h. Даже, например, под дебагером (щас я имею в виду TD) смотрим код с 66h и 67h, то в первом случае он эту команду дизассемблирует неверно, а во втором все правильно.
Привет!
С Праздником всех!
С переходом я отлично знаком, и про теневую часть знаю, просто праздник - елку туда, сюда, игрушки, стол накрыть - у компьютера урывками, вот и сглючил.
Взял из MenuetOS - jmp pword 8h:continue(говорю же - сглючил я :( ), все равно не работает. Потому что я указал смещение, а надо было еще учесть, что сегмент с 70000h начинается. В коде вышест. инструкция стоит как 66, но Menuet работает. Сейчас поправлю, потом за страницу возьмусь, потом и результаты сообщу. Спасибо!
Я тут уверял, что 67h - это правильно, оказывается, я ошибался, работает только 66h!!!
Не судите строго.
Еще раз приношу свои извинения.
ЛЮДИ, ПРОСТИТЕ МЕНЯ ПОЖАЛУЙСТА!!!
Я тут уверял, что 67h - это правильно, оказывается, я ошибался, работает только 66h!!!
Не судите строго.
Еще раз приношу свои извинения.
Вот так вот - говорил же, что 66h!
Я вот ещё что хотел спросить, что такое pword?
Вот так вот - говорил же, что 66h!
Я вот ещё что хотел спросить, что такое pword?
Это 6 байт