Почему MOV не может установить CS, регистр сегмента кода, даже если он может устанавливать другие? - PullRequest
0 голосов
/ 25 сентября 2018

Мне нужно было узнать, есть ли какие-либо ограничения на загрузку регистров сегмента кода напрямую, используя инструкции mov.

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

Значит ли это использование инструкции перехода из-за какого-либо такого ограничения?Почему мы не можем напрямую загрузить значение в сегмент кода?

1 Ответ

0 голосов
/ 25 сентября 2018

Установка CS будет быть прыжком, потому что выборка кода происходит из CS: IP (или CS: RIP / EIP).

Имеет смысл, что выполнение ограничено jmp far / call far / ret far и другие инструкции по передаче управления.

Изменение CS без изменения IP было бы странным: следующая команда, которая будет выполнена после гипотетической инструкции mov cs, ax, будет new_CS_base:old_IP+2 (потому что mov cs,ax имеет длину 2 байта, если вы не используете префикс размера операнда.)

Конечно, вы можете настроить все так, чтобы у вас был код с одинаковым смещением IP относительно двух разных баз сегментов, нотот факт, что pop cs - это прыжок, а pop ds - это не странно.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1021* Можно ли манипулировать указателем инструкций в сборке 8086? *1021*.*.


Помните, что защищенный режим 386 был расширением;в реальном режиме значение CS использовалось непосредственно как основание сегмента = cs<<4. Вариант использования загрузки нового дескриптора с той же базой был новым с 386, (или, возможно, 286 защищенным режимом. До этого на самом деле не было варианта использования для mov cs, r/m16 или pop csкодов операций, поэтому корпорация Intel зарезервировала эти кодировки команд для других целей.

И упростила будущие процессоры, не поддерживая mov cs, r/m или pop cs в качестве инструкций перехода, которые должны были бы отбрасывать предварительно выбранный код.

(В некоторых ранних версиях 8086 pop cs существовал, следуя той же схеме, что и push / pop других регистров сегментов, и имел код операции 0x0f, но Intel мудро решила зарезервировать 0F дляиспользовать в качестве escape-байта для многобайтовых кодов операций в будущих процессорах x86. Что произойдет, если регистр сегмента CS будет изменен? ).


Изменение CS в защищенном режиме дажеменее распространен, чем в реальном режиме, поэтому определенно не нужно было начинать поддерживать mov для CS. jmp far работает превосходно, и на самом деле лучше, потому что вам не нужно гарантировать, что IP / EIPсмещение относительно базы сегмента одинаково до / после.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...