Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Help! pmode(З/Р)

419
30 декабря 2002 года
Mitja Gladkih
284 / / 19.12.2002
Ну вот... клинит у меня программа...
Выкинул ВСЕ, остался не скелет, а только позвоночник... - все равно не работает.
Перезагружается.
Заранее спасибо!
Вот текст:

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
424
30 декабря 2002 года
(C)dragon
307 / / 04.12.2002
>DB 0EAh
>DW CONTINUE
>DW 8

Что это ещё за бред? Во первых перед дальним jmp должен стоять префикс 66h для того, чтобы использовать традцатидвухбитное смещение, а у тебя оно какое? Вместо DW CONTINUE должен стоять DD со смещением относительно базы сегмента, 458752, как указано в дескрипторе сегмента кода, селектор которого действительно 8.

db 66h
db 0EAh
dd CodeSegOffset
dw 8

где CodeSegOffset - смещение относительго базы сегмента кода.
395
31 декабря 2002 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by (C)dragon
>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 - префикс разрядности операнда.

424
31 декабря 2002 года
(C)dragon
307 / / 04.12.2002
Странно, в каком-то примере перехода в защищённый режим я видел префикс 66h, подумал, что это правильно.

Да конечно, с наступающим всех!!!
424
31 декабря 2002 года
(C)dragon
307 / / 04.12.2002
Да, ещё забыл - ЗАЧЕМ ТАМ НУЖНА IDT, КОГДА КОМАНДОЙ CLI ЗАПРЕЩЕНЫ ПРЕРЫВАНИЯ!?
419
31 декабря 2002 года
Mitja Gladkih
284 / / 19.12.2002
Цитата:
Originally posted by (C)dragon
Да, ещё забыл - ЗАЧЕМ ТАМ НУЖНА IDT, КОГДА КОМАНДОЙ CLI ЗАПРЕЩЕНЫ ПРЕРЫВАНИЯ!?


А исключения как же?
Кстати, видел рабочий пример, где far jmp как у меня, и все работает. К тому же у меня, пока с исключениями не работал, все с этим переходом было в норме. Кстати, странно, но в MenuetOS используется near jmp, и все работает!?
С Наступающим!

419
31 декабря 2002 года
Mitja Gladkih
284 / / 19.12.2002
Да! Сегмент-то у меня 32-разрядный! Значит, если поставлю db 67h, нужен будет 16-битный переход!
Так ведь?
424
31 декабря 2002 года
(C)dragon
307 / / 04.12.2002
Для перехода в защищённый режим нужен 32-разрядный переход, можно использовать jmp far, call far, и iret. Сомневаюсь, чтобы с ближним jmp сработало, т.к. он не меняет регистр cs. А насчёт префикса - на wasm.ru в статье про переход в защищённый режим используется префикс 66h, а не 67h.

А вообще бросай на пару дней всё это дело и встречай новый год!
419
31 декабря 2002 года
Mitja Gladkih
284 / / 19.12.2002
Цитата:
Originally posted by (C)dragon
Для перехода в защищённый режим нужен 32-разрядный переход, можно использовать jmp far, call far, и iret. Сомневаюсь, чтобы с ближним jmp сработало, т.к. он не меняет регистр cs. А насчёт префикса - на wasm.ru в статье про переход в защищённый режим используется префикс 66h, а не 67h.

А вообще бросай на пару дней всё это дело и встречай новый год!


Я знаю, что нужен дальний переход.
стянул из MenuetOS: (ошибся насчет near, глаза разбежались:))
jmp pword 8:CONTINUE, все равно не работает!
С Новым Годом!
Отключаюсь, конец связи...
пип...пип...пип...п

424
01 января 2003 года
(C)dragon
307 / / 04.12.2002
Вот теперь наконец-то я в состоянии ответить...

---


Вроде как база сегмента кода - 458752, а CONTINUE - смещение относительно старого сегмента кода из реального режима, в итоге конечный адрес перехода - не метка CONTINUE, а полный ОТСТОЙ! А адрес этой метки надо высчитывать заранее.

Теперь по поводу ближнего jmp в menuet, видимо там значение сегментного регистра cs в реальном режиме совпадает в селектором сегмента кода в защищённом режиме, поэтому и работает.

Ну что, с наступившим!!!
395
02 января 2003 года
RelB
367 / / 09.11.2002
Всех с Наступившим!!! Пить надо меньше, надо меньше пить....

При корректном написании просто необходимо использовать далиний переход, т.е. ОБЯЗАТЕЛЬНО командами jmp far, call far, iretd, retf - какой больше нравится, независимо из какого в какой сегмент перебегать (32\16). Мне кажется, что вы не до конца знакомы именно с теоретической частью переключения из защ. режима в реальный и наоборот. Все сегментные регистры (cs, ds, es, ss и т.д.) содержат в себе еще и т.н. теневую часть, которая появилась в 286 процессоре. Суть ее в том, что при записи номера дескриптора в сегментный регистр, в теневую часть грузится сам дескриптор. Далее процессор пользуется именно этой теневой частью. Т.е. мы можем загрузить в сегментные регистры нужные нам селекторы, удалить GDT и все будет работать, пока мы не попытаемся загрузить в сегментный регистр чего-нить еще. Поэтому даже если значения селектора и сегмента совпадают, то при переходе из реального режима в защищенный все равно НЕОБХОДИМО использовать дальний переход, чтобы загрузить теневую часть!!!

Именно из-за этой теневой части родился на свет нереальный режим, когда мы сбросили бит зажищенного режима в CR0, но не перезагрузили сегментные регистры.

Далее, может и без разницы 66h или 67h, но при корректном написании необходимо использовать 67h. Даже, например, под дебагером (щас я имею в виду TD) смотрим код с 66h и 67h, то в первом случае он эту команду дизассемблирует неверно, а во втором все правильно.
419
02 января 2003 года
Mitja Gladkih
284 / / 19.12.2002
Цитата:
Originally posted by RelB
Всех с Наступившим!!! Пить надо меньше, надо меньше пить....

При корректном написании просто необходимо использовать далиний переход, т.е. ОБЯЗАТЕЛЬНО командами 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 работает. Сейчас поправлю, потом за страницу возьмусь, потом и результаты сообщу. Спасибо!

395
08 января 2003 года
RelB
367 / / 09.11.2002
ЛЮДИ, ПРОСТИТЕ МЕНЯ ПОЖАЛУЙСТА!!!
Я тут уверял, что 67h - это правильно, оказывается, я ошибался, работает только 66h!!!

Не судите строго.

Еще раз приношу свои извинения.
424
08 января 2003 года
(C)dragon
307 / / 04.12.2002
Цитата:
Originally posted by RelB
ЛЮДИ, ПРОСТИТЕ МЕНЯ ПОЖАЛУЙСТА!!!
Я тут уверял, что 67h - это правильно, оказывается, я ошибался, работает только 66h!!!

Не судите строго.

Еще раз приношу свои извинения.



Вот так вот - говорил же, что 66h!

Я вот ещё что хотел спросить, что такое pword?

419
09 января 2003 года
Mitja Gladkih
284 / / 19.12.2002
Цитата:
Originally posted by (C)dragon


Вот так вот - говорил же, что 66h!

Я вот ещё что хотел спросить, что такое pword?


Это 6 байт

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог