В каком режиме загружаются селекторы и почему? - вопрос №4150775
Здравствуйте, я не знаю, где задать этот вопрос. Но верю, что программисты С/C++ больше знакомы с темой операционных систем. Вопрос следующего плана: есть программа на ассемблере по переходу из реального в защищенный режим и обратно. Вопрос по переходу из реального в защ. режим. Код:
mov eax,cr0
or al,1
mov cr0,eax
; загружаем селектор в CS командой дальнего перехода, потому что к CS недопустимо прямое программное обращение
db 66h
db 0EAh
dd offset PM_entry
dw SEL_32bitCS
; переходимна PM_entry
; точка входа в 32-битный защищенный режим
PM_entry:
; делаем адресуемыми cегмент данных, стека, видеобуфера. CS мы адресовали ранее. Так как FlatDS используется в функции подсчета памяти, то адресуемым этот сегмент я делаю в ФУНКЦИИ, а не здесь
mov ax, SEL_32bitDS
mov ds, ax
mov ax, SEL_videobuffer
mov es, ax
mov ax, SEL_32bitSS
mov ss, ax
Собственно, был задан вопрос, в каком режиме загружаются селекторы и почему. Я отвечаю: В защищенном. Как в защищенном, так и в реальном режимах адресация производится через сегментную часть и смещение.Но в защищенном режиме в качестве сегментной части указывается селектор дескриптора, в отличие от реального, где в сегментной части указывается адрес начала сегмента.
И после перехода в защ. режим прежде всего я загружаю в используемые сегментные регистры селекторы соответствующих сегментов. Так как мы изменили содержимое сегм. регистров, то происходит загрузка дескрипторов в соответствующие теневые части этих сегментных регистров, то есть в каждом теневом регистре окажется базовый адрес соотв. сегмента.
Загрузка в теневые регистры выполняется с целью минимизировать кол-во обращений к ОЗУ Единственное, к регистру CS недопустимо прямое программное обращение, поэтому я использую дальний переход. На что мне сказали, что это неверно (конкретно что неверно — не знаю). Если кто знает, помогите разобраться в проблеме. Заранее огромное спасибо!!!