Инструкция Retn

Макрос Rom_call Используется для вызова процедур без применения стека. Этим способом вызова процедур приходится пользоваться во время исполне­ния кода блока Начальной загрузки, так как RAM в это время еще недоступ­на, и код исполняется из чипа ROM BIOS. В некоторых BIOS вызываемая процедура возвращается в вызывающую посредством инструкции Retn. Де­лается это следующим образом. Как уже говорилось, адрес возврата для инст­рукции Retn Указывается в регистровой паре ss:sp показывает­ся, как это обстоятельство используется в макросе Rom_call. Как можно видеть исполнение инструкции Retn Зависит от текущего состояния регистровой пары Ss:sp. Но ведь перед использовани­ем регистра Ss Его необходимо инициализировать Правильным 16-битным значением защищенного режима, а этого сделано не было! Как же тогда этот код может работать? Ответить на этот вопрос сложно. Давайте рас­смотрим ситуацию, когда значение регистра Ss Модифицировалось в по­следний раз перед исполнением кода, приведенного в листинге Соот­ветствующий фрагмент кода приведен в листинге 4.4. Загружаем в регистр ds действительный дескриптор данных, ds = дескриптор данных теперь может адресовать пространство адресов объемом в 4 Гбайт, bx = OOOOh Esi = 0000 OOOOhКод, расположенный по адресу Fooo :E062h показывает, что в регистр Ss Загружено значение Foooh21. Это подразумевает, что в теневой регистр дескрипторного кэша22 будет загружено значение Ss*i6, Что соответ­ствует физическому адресу F_ooooh. Поскольку загрузки новых значений в регистр Ss Не производится, это значение сохраняется даже после того, как инструкцией, расположенной по адресу F000:61A8 компью­тер переключается в 16-битный защищенный режим. Объяснение этому можно найти в томе 3 руководства разработчика программного обеспечения архитектуры Intel IA-32



Рубрика: Женский интерес

Комментарии закрыты.