Начала программирования в защищённом режиме (часть 2)

Дата публикации 24 авг 2017 | Редактировалось 10 янв 2018
Линейный адрес таблицы указывает, в какой области оперативной памяти находится таблица. Размер таблицы считается в байтах, при чём значение битов 0-15 должно быть на единицу меньше реального размера таблицы.
Структура регистра LDTR выглядит следующим образом:
[​IMG]
Рисунок 17. Структура данных регистра LDTR
Из всех 10 байт нам доступны лишь младшие два байта (биты 0-15), в которые следует загрузить селектор дескриптора таблицы LDT, находящийся в таблице GDT.
В таком случае общий механизм преобразования логического адреса в линейный происходит по схеме, изображённой на рисунке 18.
[​IMG]
Рисунок 18. Формирование линейного адреса в защищённом режиме
Операции над регистрами GDTR, LDTR, IDTR перечислены в следующей таблице:
КомандаОписание
lgdtзагрузить регистр GDTR
sgdtпрочитать значение регистра GDTR
lldtзагрузить регистр LDTR
sldtпрочитать значение регистра LDTR
lidtзагрузить регистр IDTR
sidtпрочитать значение регистра IDTR
Таблица 1. Операции над регистрами GDTR, LDTR, IDTR
Подробнее с использованием этих команд познакомимся в следующих статьях.
Теперь рассмотрим команды, которые переопределяют сегментные регистры. Команды позволяют переопределить сегментные регистры как явно, так и неявно. Команды явного переопределения сегментных регистров перечислены ниже:
КомандаОписание
movзапись в регистр значения
popизвлечение из стека
ldsзагрузка регистра DS
lesзагрузка регистра ES
lfsзагрузка регистра FS
lgsзагрузка регистра GS
lssзагрузка регистра SS
Таблица 2. Команды явного переопределения сегментных регистров
К командам неявного переопределения регистров относятся следующие:
КомандаОписание
callвызов функции
jmpпрыжок
retвозвращение из функции
sysenterбыстрый системный вызов
sysexitбыстрый возврат из системного вызова
iretвыход из обработчика прерывания
int, into, int3вызов прерывания
Таблица 3. Команды неявного переопределения сегментных регистров
Команды явного переопределения регистров предназначены для операций над регистрами DS, ES, FS, GS, SS. Чтобы попытаться изменить сегментный регистр CS, нам потребуется воспользоваться неявными командами. Теперь мы располагаем достаточной информацией, чтобы реализовать выполнение 32-битного кода. Но это уже будет в следующей части.
© SadKo 2006

1 4.048
SadKo

SadKo
Владимир Садовников

Регистрация:
4 июн 2007
Публикаций:
8