- •Введение
- •Сведения об архитектуре процессоров 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
- •Оглавление
2.4.3. Символьные и строковые константы
Символьная константа представляет собой один символ ASCII или ANSI, строковая - последовательность из двух и более символов, заключенных в апострофы или кавычки. Результатом трансляции этих констант являются коды соответствующих символов. Пример символьной константы;"W" или 'W'. Пример строковой константы;"HELLO" или 'ПРИВЕТ'. Символы могут быть представлены в UNICODE, тогда код одного символа занимает два байта.
2.5. Структура строки языка ассемблера
Программа на языке ассемблера состоит из последовательности строк (предложений). Строка представляет собой комбинацию лексем, заканчивающуюся символами "Возврат каретки"(CR), "Перевод строки"(LF). Строка может быть пустой, содержать машинную команду или директиву с комментарием или без комментария, содержать только комментарий.
2.5.1. Структура строки, содержащей машинную команду
Строка может включать в себя до пяти полей: метки, префикса команды, кода операции, операндов, комментариев. Поля могут ограничиваться специальными символами и/или разделяться пробелом или символом табуляции.
Поле метки содержит определяемое пользователем имя и ограничивается символом :. Между : и префиксом команды или полем кода операции могут быть пробелы или поле табуляции. Значением метки является адрес соответствующей команды. Метки как операнды используются в командах передачи управления.
Поле префикса команды может содержать один или два не противоречащих друг другу префикса, разделенных пробелом или полем табуляции.
Поле кода операции содержит мнемоническое представление кода команды и отделяется от полей префикса команды и операндов полем табуляции или пробелами.
Поле операндов содержит один или два операнда. Если операнда два, то они разделяются запятой.
Поле комментария отделяется от поля операндов символом ;. Поле комментария может содержать любые символы, в том числе и символы, не принадлежащие алфавиту ассемблера.
В строке, содержащей машинную команду, формально обязательным является только поле кода операции.
2.5.2.Структура строки, содержащей только комментарий
Если строка содержит только комментарий, она должна начинаться символом ;.
2.6. Директивы
Директивы служат для управления трансляцией, функции их весьма разнообразны, поэтому они не имеют общей формы записи. Ниже приведено описание наиболее часто используемых директив.
2.6.1. Установка режимов трансляции
По умолчанию TASM транслирует команды процессора 8086.
Директива .8087 позволяет транслировать арифметические команды с плавающей запятой для сопроцессора 8087.
Директива .386 разрешает трансляцию команд процессора 80386
Директивы установки режима трансляции, если они используются, располагаются в начале исходного текста.
2.6.2. Директива MODEL
Директива MODEL позволяет задавать в программе одну из нескольких стандартных моделей управления памятью, когда используется упрощенное описание сегментов. Кроме того, ее можно использовать для указания языкового соглашения, определяющего порядок передачи параметров функциям API, и возврата из подпрограммы.
Как известно, функции API написаны на языке С. Ассемблерные программы используют их как внешние процедуры. Для правильной передачи параметров функциям API и использования результатов их работы необходимо определить языковое соглашение.
Для функций WIN32 API применяется соглашение STDCALL. В этом случае параметры помещаются в стек в обратном порядке, вызываемая процедура освобождает стек при своем завершении.
Перед первой командой процедуры транслятор вставляет код пролога, который выполняет следующие операции: сохраняет текущее значение EВР в стеке, загружает в EВР текущее значение регистра – указателя стека ESP, устанавливает указатель стека на область локальных переменных, сохраняет в стеке регистры, указанные в USES описания процедуры. При завершении процедуры вставляется код эпилога, выполняющий операции, обратные операциям пролога: восстанавливает из стека регистры, указанные в USES описания процедуры, изменяет указатель стека, освобождая область локальных переменных, восстанавливает из стека EВР, освобождает стек от переданных процедуре переменных, если этого требуют языковые соглашения, и осуществляет возврат.
Ключевое слово NOLANGUAGE в качестве языкового соглашения означает отмену автоматической генерации пролога и эпилога. В этом случае передача аргументов через стек и код пролога и эпилога должны присутствовать в тексте программы в явном виде [5].
MODEL <модель_памяти>,<языковое_соглашение>
В режиме MASM применяется тот же синтаксис, но с директивой .MODEL.
В случае программирования в среде Windows для защищенного режима модель памяти будет flat, что означает с логической точки зрения наличие совмещенных четырех гигабайтных сегмента, нижняя граница которых 0. Поэтому в адресных операндах программ защищенного режима используются только смещения.
