Системное программное обеспечение. Особенности программирования 32-разрядных процессоров. Рощин А.В. - 28 стр.

UptoLike

Составители: 

28
физический адрес страницы известен, он равен B8000h. Младшие 16
разрядов базы (число 8000h) заполняют слово base_l дескриптора, биты
16... 19 (число 0bh) – байт base_m. Биты 20...31 базового адреса равны 0,
поскольку видеобуфер размещается в первом мегабайте адресного
пространства.
Перед переходом в защищенный режим процессору надо будет
сообщить физический адрес таблицы глобальных дескрипторов и ее
размер (точнее, границу). Размер GDT определяется на этапе трансляции в
строке 30.
Назначение оставшихся строк сегмента данных станет ясным в
процессе рассмотрения программы.
Сегмент команд text (строка 41 листинга) начинается, как и всегда,
оператором segment, в котором указывается тип использования use16, так
как мы составляем 16-разрядное приложение. Указание описателя usel6.He
запрещает использовать в программе 32-битовые регистры.
Фактически вся программа примера, кроме ее завершающих строк, а
также фрагмента, выполняемого в защищенном режиме, посвящена
подготовке перехода в защищенный режим. Прежде всего, надо завершить
формирование дескрипторов сегментов программы, в которых остались
незаполненными базовые адреса сегментов. Базовые (32-битовые) адреса
определяются путем умножения значений сегментных адресов на 16.
Сначала производится очистка 32-разрядного аккумулятора (строка 44),
так как в нем будет сформирован позднее базовый 32-разрядный адрес
(фактически эта команда нужна для очистки старшего слова расширенного
аккумулятора). После обычной инициализации сегментного регистра DS
(строки 45, 46), которая позволит нам обращаться к полям данных
программы (в реальном режиме!) выполняется сдвиг на 4 разряда
содержимого регистра EАХ. Эта операция выполняется командой shl
EAX,4. Команда сдвигает влево содержимое 32-разрядного аккумулятора
физический адрес страницы известен, он равен B8000h. Младшие 16
разрядов базы (число 8000h) заполняют слово base_l дескриптора, биты
16... 19 (число 0bh) – байт base_m. Биты 20...31 базового адреса равны 0,
поскольку видеобуфер размещается в первом мегабайте адресного
пространства.
     Перед переходом в защищенный режим процессору надо будет
сообщить физический адрес таблицы глобальных дескрипторов и ее
размер (точнее, границу). Размер GDT определяется на этапе трансляции в
строке 30.
     Назначение оставшихся строк сегмента данных станет ясным в
процессе рассмотрения программы.
     Сегмент команд text (строка 41 листинга) начинается, как и всегда,
оператором segment, в котором указывается тип использования use16, так
как мы составляем 16-разрядное приложение. Указание описателя usel6.He
запрещает использовать в программе 32-битовые регистры.
     Фактически вся программа примера, кроме ее завершающих строк, а
также фрагмента, выполняемого в защищенном режиме, посвящена
подготовке перехода в защищенный режим. Прежде всего, надо завершить
формирование дескрипторов сегментов программы, в которых остались
незаполненными базовые адреса сегментов. Базовые (32-битовые) адреса
определяются путем умножения значений сегментных адресов на 16.
Сначала производится очистка 32-разрядного аккумулятора (строка 44),
так как в нем будет сформирован позднее базовый 32-разрядный адрес
(фактически эта команда нужна для очистки старшего слова расширенного
аккумулятора). После обычной инициализации сегментного регистра DS
(строки 45, 46), которая позволит нам обращаться к полям данных
программы (в реальном режиме!) выполняется сдвиг на 4 разряда
содержимого регистра EАХ. Эта операция выполняется командой shl
EAX,4. Команда сдвигает влево содержимое 32-разрядного аккумулятора


                                      28