- •Введение
- •Сведения об архитектуре процессоров intel 80х86 и операционной системе windows, необходимые для программирования на ассемблере
- •1.1. Программно доступные регистры
- •1.2. Организация памяти [5]
- •1.2.1. Сегментация
- •1.2.2. Дескрипторы сегментов
- •1.2.3 Адресное пространство режима реального адреса
- •1.2.4. Адресное пространство защищенного режима [6]
- •1.2.5. Виртуальное адресное пространство
- •1.2.6. Способы адресации операндов
- •Регистровый операнд
- •Непосредственный операнд
- •1.3. Организация ввода – вывода
- •1.3.1. Консоль
- •1.3.2. Графический интерфейс пользователя
- •1.4. Система команд
- •Команды пересылки данных
- •Команды ввода/вывода
- •Команды целочисленной арифметики
- •Логические операции
- •Операции сдвигов
- •Команды передачи управления
- •Командные прерывания
- •Команды управления процессором
- •Команды обработки последовательности кодов
- •Команды для работы со стеком
- •2. Описание языка ассемблера
- •2.1. Алфавит языка ассемблера
- •2.2. Лексемы
- •2.3. Имена
- •2.3.1. Ключевые слова
- •2.3.2. Имена пользователя
- •2.4. Константы
- •2.4.1.Целые числа
- •2.4.2. Вещественные числа
- •2.4.3. Символьные и строковые константы
- •2.5. Структура строки языка ассемблера
- •2.5.1. Структура строки, содержащей машинную команду
- •2.6.3. Директивы упрощенного определения сегментов
- •2.6.4. Директивы определения сегментов и групп
- •2.6.5. Директивы описания процедуры
- •2.6.6. Директивы определения данных
- •2.6.7. Директивы определения имен
- •2.6.8. Директивы внешних ссылок
- •2.6.7. Директивы управления трансляцией
- •2.6.8. Макросредства
- •2.7. Операции в выражениях
- •2.7.1. Арифметические операции
- •2.7.2. Логические операции
- •2.7.3. Операции отношения
- •2.7.4. Операции, возвращающие значения
- •2.7.5. Операции присваивания атрибута
- •Трансляция программ
- •. Компиляция
- •3.2. Компоновка
- •Библиографический список
- •Функции api
- •1. Функция GetModuleHandleA
- •2. Функция LoadIcon
- •3. Функция LoadCursor
- •4. Функция Register Class
- •5. Функция CreateWindowExA
- •6. Функция ShowWindow
- •7. Функция UpdateWindow
- •8. Функция GetMessage
- •9. Функция DispatchMessage
- •10. Функция ExitProcess
- •11. Функция BeginPaint
- •12. Функция TextOutA
- •13. Функция EndPaint
- •Описание структур, определенных в фале win32.Inc
- •1. Структура wndclass
- •2. Структура сообщения
- •3. Структура paintstruct
- •Продолжение прил. 4
- •4. Структура rect
- •Формат командной строки и ключи транслятора tasm32
- •Формат командной строки и ключи компоновщика tlink32
- •Оглавление
1.2.2. Дескрипторы сегментов
Дескрипторы - это объекты, находящиеся в соответствующих таблицах, на которые указывают селекторы сегмента. Они представляют собой 8-байтовые блоки, содержащие атрибуты области линейных адресов, то есть сегмента. Эти атрибуты включают 32-разрядный линейный базовый адрес сегмента, 20-разрядную длину и дробность сегмента, уровень защиты, привилегии по чтению, записи и выполнению, размер операндов по умолчанию (16-или 32-разрядные) и тип сегмента. Вся информация об атрибутах дескриптора содержится в 12 битах дескриптора сегмента. Сегменты в целом имеют три поля атрибутов: бит Р присутствия, биты DPL уровня привилегий дескриптора и бит S дескриптора сегмента.
S - бит системного сегмента – определяет, является ли сегмент системным (S=0), или же сегментом программы или данных (S=1).
Дескрипторы сегментов хранятся либо в таблице GDT либо в таблице LDT, которые процессор адресует с помощью регистров GDTR или LDTR соответственно.
Дескриптор сегмента обеспечивает процессор информацией, которая нужна ему для отображения логического адреса в линейный адрес. Эти дескрипторы создаются не прикладными программами, а компиляторами, редакторами связей, загрузчиками или операционной системой. На рис. 1.7 показан общий формат дескриптора сегмента, размер его – 8 байтов.
Дескриптор сегмента имеет следующие поля: база определяет место сегмента внутри линейного 4Г байт адресного пространства. Процессор объединяет три фрагмента базового адреса для формирования одного 32-разрядного значения; граница определяет размер сегмента.
Процессор связывает две части поля границы для формирования 20-разрядного результата. Затем он интерпретирует поле границы одним из двух способов в зависимости от состояния бита дробности:
1) в единицах байтов для определения границы до 1М байт;
2) в единицах страниц по 4К байт для определения границы до 4Г байт.
При загрузке поле границы сдвигается влево на 12 бит и в младшие биты вставляются единицы.
Бит дробности (G-гранулярность) – старший бит поля атрибутов. Если установлен, граница интерпретируется в единицах по 4К байт, если сброшен – в байтах.
31 0
База сегмента 0-15 |
Граница сегмента 15-0
|
|||
База сегмента 24-31 |
Атри-буты |
Граница сегмента 19-16 |
Атрибуты |
База сегмента 16-23 |
Рис. 1.7. Общий формат дескриптора сегмента
1.2.3 Адресное пространство режима реального адреса
Физическая память организована в виде последовательности 8-разрядных ячеек - байтов. Каждому байту присвоен уникальный адрес. В реальном режиме реализована сегментная модель памяти. Сегментные регистры содержат информацию о базовом адресе сегмента. Процесс формирования физического адреса проще всего проследить на примере получения адреса команды. При определении физического адреса процессор сдвигает содержимое сегментного регистра CS на 4 двоичных разряда (умножает на 16) и складывает результат сдвига со смещением – содержимым регистра IP, логическим адресом команды внутри сегмента (рис.1.8). Поэтому адресное пространство реального режима вне зависимости от возможностей процессора имеет размер 1М байт.
Р
ис.1.8.
Формирование физического адреса в
реальном режиме
