Assembler - язык неограниченных возможностей


Проверка типа сегмента


  1. Загрузка селектора (и дескриптора) в регистр:
    • в CS можно загрузить только сегмент кода;
    • в DS, ES, FS, GS можно загрузить только селектор сегмента данных, сегмента кода, доступного для чтения, или нулевой селектор;
    • в SS можно загрузить только сегмент данных, доступный для записи;
    • в LDTR можно загрузить только сегмент LDT;
    • в TR можно загрузить только сегмент TSS.

  2. Обращение к памяти:
    • никакая команда не может писать в сегмент кода;
    • никакая команда не может писать в сегмент данных, защищенный от записи;
    • никакая команда не может читать из сегмента кода, защищенного от чтения;
    • нельзя обращаться к памяти, если селектор в сегментном регистре нулевой.

  3. Исполнение команды, использующей селектор в качестве операнда:
    • дальние CALL и JMP могут выполняться только в сегмент кода, шлюз вызова, шлюз задачи или сегмент TSS;
    • команда LLDT может обращаться только к сегменту LDT;
    • команда LTR может обращаться только к сегменту TSS;
    • команда LAR может обращаться только к сегментам кода и данных, шлюзам вызова и задачи, LDT и TSS;
    • команда LSL может обращаться только к сегментам кода, данных, LDT и TSS;
    • элементами IDT могут быть только шлюзы прерываний, ловушек и задач.

  4. Некоторые внутренние операции:
    • при переключении задач целевой дескриптор может быть только TSS или шлюзом задачи;
    • при передаче управления через шлюз сегмент, на который шлюз указывает, должен быть сегментом кода (или TSS для шлюза задачи);
    • при возвращении из вложенной задачи селектор в поле связи TSS должен быть селектором сегмента TSS.





Начало  Назад  Вперед