Можно ли использовать 32-битные регистры / инструкции в реальном режиме? - PullRequest
7 голосов
/ 02 августа 2011

Я запутался в простой задаче сборки при изучении некоторого простого исходного кода os.

На этом сайте: http://wiki.osdev.org/Babystep7 следующий код предназначен для перехода из реального режима в защищенный режим

mov  eax, cr0
or al,1
mov  cr0, eax

Я знаю, как перейти из реального режима в защищенный режим.
Но мой вопрос в том, что, поскольку программа все еще находится в реальном режиме, как она может использовать 32-битные регистры или инструкции?

Можно ли использовать 32-битные регистры / инструкции в реальном режиме?

Ответы [ 6 ]

8 голосов
/ 03 августа 2011

Когда процессор работает в реальном режиме (как это происходит сразу после загрузки), по умолчанию используется 16-битный код.Однако это означает , а не , что означает, что вы не можете использовать 32-разрядные инструкции.

Существует префикс «override size override» (66h), который изменяет режим по умолчанию для одной инструкции,Когда этот префикс используется с инструкцией, выполняемой в 16-битном реальном режиме, он переключит инструкцию на 32-битную.И наоборот, когда этот префикс используется с инструкцией, выполняемой в 32-битном защищенном режиме, он переключит инструкцию на 16-битную.(Аналогичный префикс, 67h, работает для переопределения размеров адресов.)

Затем, используя этот префикс, можно использовать 32-разрядные регистры в 16-разрядном реальном режиме.Ваш ассемблер почти наверняка сгенерирует этот префикс автоматически, когда вы попытаетесь использовать 32-битные операнды с инструкцией при сборке 16-битного кода.

К сожалению, такого префикса переопределения для 64-битных инструкций не существует, поэтому онине может быть использован в реальном режиме.Вам нужно переключиться в «длинный режим», чтобы разрешить это.

5 голосов
/ 02 августа 2011

Насколько я понимаю, реальный режим не влияет на команды, которые вы можете запускать на ЦП, но влияет на интерпретацию эталонных команд памяти ЦП.

Итак, да, вы можете использовать eax, но вы не сможете получить ячейку памяти [eax].

См. Соответствующую часть в Руководстве Intel .

0 голосов
/ 05 июня 2012

Возможно, вы можете использовать опкод LoadAll 0F07h , который дает вам 32-битный доступ в 16-битном реальном режиме.

0 голосов
/ 22 мая 2012

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

0 голосов
/ 22 мая 2012

Для простой адресации префиксы операнда и размера инструкции работали очень хорошо.16-разрядное приложение защищенного (изначально реального) режима, которое я когда-то писал для Windows (3.1 и более поздние версии для 9x), могло выделять> 64 КБ областей памяти, используя API памяти Windows, и вопрос был в том, как его использовать.В любом случае, используя (дальний) указатель указателя и упомянутые префиксы, мое приложение хорошо использовало области 40 МБ, даже если оно работало в 16-битном режиме.

Если вы попробуете что-то подобное, помните, что префикс размера инструкции включает32-битный набор команд, который несовместим с 16-битным.Для 16-битного режима все равно, в реальном ли вы режиме или в защищенном, если вы не выполняете арифметику сегментов.Таким образом, вам нужно передать код (по крайней мере, я) 32-битным операциям с использованием emit, потому что ваш компилятор, вероятно, не сгенерирует их без крика кровавого убийства.

0 голосов
/ 02 августа 2011

Насколько я знаю, в реальном режиме нельзя использовать 32-битные регистры. В 32-битном регистре управления CR0 реальный режим и защищенный режим определяются путем просмотра первого бита CR0 (PE). В этом коде вы меняете PE в последней строке (mov cr0, eax). Я думаю, после этой строки вы больше не можете использовать 32-битные ссылки на регистры.

...