- •Введение
- •Сведения об архитектуре процессоров 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. Организация памяти [5]
Оперативная память представляет собой последовательность байтов. Байт является минимально адресуемым объемом памяти. Два смежных байта называются словом. Наиболее употребляемым типом данных защищенного режима являются два смежных слова – двойные слова. Два смежных двойных слова называются словами четырёхкратной длины. Можно адресовать десятибайтные ячейки памяти. Адресом ячейки, превышающей по размерам байт, является адрес ее младшего байта. Это самые общие сведения о памяти, необходимые для написания программы на ассемблере. Для работы с любым отладчиком необходимы сведения о логической организации и управления памятью операционной системой и аппаратной поддержке этого управления процессором.
1.2.1. Сегментация
Сегментация - это разделение памяти на логические блоки с целью эффективного управления пространством логических адресов. Сегменты используются для объединения областей памяти, которые имеют общие атрибуты. При сегментной организации памяти она представляется как одна или несколько последовательностей элементарных ячеек (байтов) переменной длины, размером от одного байта до шестидесяти четырех килобайт в режиме реального адреса и до четырех гигабайт в защищенном режиме. Каждая из этих областей линейного адресного пространства (сегментов) имеет несколько связанных с ней атрибутов. Они включают ее размер, расположение, тип (стек, программа или данные) и характеристики защиты. Эта организация определяется архитектурой процессора.
Видимая программистами модель организации памяти определяется при проектировании вычислительной системы. Архитектура дает программистам свободу выбора модели для каждой задачи и для соответствующей операционной среды. Моделями режима реального адреса являются следующие модели памяти:
tiny – сверхмалая - код программы и ее данные размещаются внутри одного и того же сегмента размером 64К байт, код и данные имеют ближний тип;
small – малая - код программы размещается внутри одного сегмента размером 64К байт, а данные - в отдельном сегменте данных размером тоже 64К байт, и код, и данные должны быть ближнего типа;
medium – средняя - код программы может превышать 64К байт, но данные помещаются в один сегмент размером 64К байт, код имеет дальний тип, а данные – ближний;
compact – компактная - код программы должен помещаться в один сегмент размером 64К байт, а данные могут превышать по размеру 64К байт, код имеет ближний тип, а данные – дальний;
large – большая - и код, и данные программы могут превышать 64К байт, но размер переменной не может превышать 64К байт, код и данные имеют дальний тип;
huge – сверхбольшая - код и данные программы могут превышать по размеру 64К байт, размер переменных также может превышать 64К байт, код и данные имеют дальний тип;
Большая и сверхбольшая модели идентичны. Модель huge введена для совместимости с языками высокого уровня.
flat – линейная – используется при программировании в защищенном режиме, размер сегмента – 4Г байт.
Линейная память: адресное пространство, состоящее из одного массива длиной до 4Г байт, которое процессор с помощью механизма трансляции адресов отображает в пространство физических адресов. С учетом аппаратной поддержки сегментации имеем совмещенные сегменты размером 4Г байт. Указатель является 32-разрядным числом, значение которого может изменяться от 0 до 232 - 1. Перемещение модулей, скомпилированных отдельно друг от друга, может быть выполнено соответствующим системным программным обеспечением. Полный указатель в этом адресном пространстве состоит из двух частей: селектора сегмента - 16-разрядного поля, идентифицирующего сегмент, и относительного 32-разрядного адреса, указывающего на байт внутри сегмента.
