
- •Программирование эвм
- •Int 21h ;кодом возврата 0 прерывания 21h
- •Работа с битами
- •Порядок выполнения работы
- •Устройства ввода-вывода
- •Ввод исходных данных с клавиатуры и вывод результатов на дисплей
- •Inc di ;смещение в видеопамяти на следующий символ
- •Порядок выполнения работы
- •Контрольные задания
- •Система команд процессора
- •Способы адресации
- •Влияние команд на регистр флагов
- •Расширенные регистры и типы данных процессоров x86
- •Система команд процессоров ia-32 и Intel 64
- •Int 21h ;системного прерывания 21h
- •Использование дальней подпрограммы
- •X dw 0aabBh, 0abbAh, 0baaBh, 0bbaAh ;исходные данные
- •Использование подпрограмм для ввода-вывода
- •Порядок выполнения работы
- •Контрольные задания
- •Дескрипторы
- •Порядок работы процессора в защищенном режиме
- •Использование дальней подпрограммы в защищенном режиме
- •Использование idt. Ввод данных с клавиатуры в защищенном режиме
- •Порядок выполнения работы
Дескрипторы
Типы дескрипторов
Выделяются следующие типы и виды дескрипторов:
-
Несистемные:
-
Сегмента кода.
-
Сегмента данных.
-
-
Системные:
-
Сегмента состояния задачи (task state segment, TSS).
-
Локальной таблицы дескрипторов (local descriptors table, LDT).
-
Специальные (дескрипторы шлюзов или вентилей (gates)):
-
Шлюза вызова (call gate).
-
Шлюза прерывания (interrupt gate).
-
Шлюза ловушки (trap gate).
-
Шлюза задачи (task gate).
-
-
Несистемные и системные неспециальные дескрипторы описывают соответствующие сегменты.
Специальные дескрипторы описывают т. н. шлюзы или вентили. Шлюзы предоставляют защищенные входы в системные процедуры и обработчики, которые работают на других уровнях привилегий, чем прикладные программы или главные процедуры. Например, CALL в шлюз вызова может предоставить доступ к процедуре в таком же или более привилегированном сегменте кода, чем текущий. Шлюзы также удобны для перехода между 16- и 32-битными сегментами кода. В режиме IA-32e шлюзы вызова полезны для переключения между 64-битным и совместимым (compatibility) режимами.
Формат несистемного дескриптора
Дескриптор сегмента данных или кода имеет следующий формат:
-
байт 7: биты 31-24 базы сегмента;
-
байт 6:
-
бит 7: бит гранулярности (0 — лимит в байтах, 1 — лимит в 4-килобайтных единицах);
-
бит 6: бит разрядности (0 — 16-битный, 1 — 32-битный сегмент);
-
бит 5: 0;
-
бит 4: зарезервировано для операционной системы;
-
биты 3-0: биты 19 – 16 лимита;
-
байт 5 (байт доступа):
-
бит 7: бит присутствия сегмента (P);
-
биты 6-5: уровень привилегий дескриптора (DPL);
-
бит 4: 1 (тип дескриптора — не системный);
-
бит 3: тип сегмента (0 — данных, 1 — кода);
-
бит 2: бит подчиненности для кода (C), бит расширения вниз для данных (D);
-
бит 1: бит разрешения чтения для кода (R), бит разрешения записи для данных (W);
-
бит 0: бит доступа (A) (1 — к сегменту было обращение);
-
байт 4: биты 23-16 базы сегмента;
-
байты 3-2: биты 15-0 базы сегмента;
-
байты 1-0: биты 15-0 лимита.
Лимит (предел) сегмента — это максимально допустимое смещение внутри него. Лимит плюс единица — это размер сегмента.
База — адрес начала сегмента.
Биты A и P байта доступа предназначены для организации виртуальной памяти. Для сегментов, находящихся в физической памяти, бит P должен быть установлен в 1. Любая попытка программы обратиться к сегменту памяти, в дескрипторе которого бит P установлен в 0, приведет к прерыванию, обработчик которого подгрузит данный сегмент в память.
Типы системных дескрипторов
Если в дескрипторе бит 4 байта доступа равен 0, дескриптор называется системным. В этом случае биты 0-3 байта доступа определяют один из шестнадцати возможных типов дескриптора (табл.9).
Таблица 9.
Типы системных дескрипторов
0 |
Зарезервированный тип |
8 |
Зарезервированный тип |
1 |
Свободный 16-битный TSS |
9 |
Свободный 32-битный TSS |
2 |
Дескриптор таблицы LDT |
A |
Зарезервированный тип |
3 |
Занятый 16-битный TSS |
B |
Занятый 16-битный TSS |
4 |
16-битный шлюз вызова |
C |
32-битный шлюз вызова |
5 |
Шлюз задачи |
D |
Зарезервированный тип |
6 |
16-битный шлюз прерывания |
E |
32-битный шлюз прерывания |
7 |
16-битный шлюз ловушки |
F |
32-битный шлюз ловушки |
Формат дескрипторов TSS и LDT
Дескрипторы TSS и LDT применяются для организации многозадачности. TSS — сегмент состояния задачи, используемый для хранения всей необходимой информации о каждой задаче в многозадачном режиме. LDT — локальная таблица дескрипторов, своя для каждой задачи.
Формат этих дескрипторов совпадает с форматом дескриптора сегмента кода или данных, за исключением того, что в байте доступа бит разрядности и системный бит равны нулю, а биты 3-0 содержат номер типа сегмента (1, 2, 3, 9, В).
Команды JMP и CALL на адрес с селектором, соответствующим TSS незанятой задачи, приводят к переключению задач.
Формат специальных дескрипторов
Шлюзы (вентили) определяют точки входа в соответствующие процедуры. Дальние CALL или JMP на адрес с любым смещением и с селектором, указывающим на дескриптор шлюза вызова, приводят к передаче управления по адресу, указанному в дескрипторе. Обычно такие дескрипторы используются для передачи управления между сегментами с различными уровнями привилегий.
CALL или JMP на адрес с селектором, указывающим на шлюз задачи, приводят к переключению задач.
Шлюзы прерываний и ловушек используются для вызова обработчиков соответственно прерываний и исключений типа ловушки.
Формат шлюзов:
-
байты 7-6: биты 31-16 смещения (0 для 16-битных шлюзов и шлюза задачи);
-
байт 5 (байт доступа):
-
бит 7: бит присутствия сегмента;
-
биты 6-5: DPL — уровень привилегий дескриптора;
-
бит 4: 0 (тип дескриптора — системный);
-
биты 3-0: тип шлюза (3, 4, 5, 6, 7, В, С, Е, 7);
-
байт 4:
-
биты 7-5: 000;
-
биты 4-0: 00000 или (для шлюза вызова) число двойных слов, которые будут скопированы из стека вызывающей задачи в стек вызываемой;
-
байты 3-2: селектор сегмента;
-
байты 1-0: биты 15-0 смещения (0 для шлюза задачи).