- •Введение
- •Сведения об архитектуре процессоров 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
- •Оглавление
Команды обработки последовательности кодов
REP |
Префикс повторения, следующая за ним операция повторяется, пока содержимое ЕСХ не станет равным нулю |
REPE, REPZ |
Дополнительное условие повторения – выполнять , пока ZF=1 |
REPNE, REPNZ |
Дополнительное условие повторения – выполнять, пока ZF=0 |
MOVS dest,src |
Команда передает код из цепочки, адресуемой через DS:[ESI] по адресам, указанным в ES:[EDI] |
LODS src |
Команда загрузки цепочки в аккумулятор |
STOS dest |
Обратная LODS |
SCAS dest |
Команда сканирования цепочки |
CMPS dest,src |
Команда сравнения цепочек |
Команды для работы со стеком
PUSH r/m |
Поместить в стек слово или двойное слово. |
PUSH const |
Поместить в стек непосредственный 8-,16-,32-разрядный операнд |
PUSHA |
Поместить в стек содержимое регистров EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP |
POP r/m |
Извлечь из стека слово или двойное слово |
POPA |
Извлечь из стека данные в регистры EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP |
PUSHF |
Поместить в стек содержимое регистра флагов |
POPF |
Извлечь из стека данные в регистр флагов |
В связи с тем, что передача параметров функциям API осуществляется через стек, необходимо обратить внимание на команды работы со стеком, количество которых существенно изменилось относительно системы команд процессора 8086. Для записи в стек служат команды PUSH. Их можно использовать с операндами, находящимися в памяти, в регистрах, а также с непосредственными операндами. Переменные в памяти могут являться словами, двойными словами, регистры могут быть как 16-разрядными, так и 32-разрядными, непосредственные операнды – 8-разрядными, 16-разрядными и 32-разрядными. В стеке данные занимают вне зависимости от внешнего представления двойное слово. В тексте программы эти команды можно представить следующим образом:
PUSH m16
PUSH m32
PUSH r16
PUSH r32
PUSH imm8
PUSH imm16
PUSH imm32
PUSH CS
PUSH SS
PUSH DS
PUSH ES
PUSH FS
PUSH GS
Команды извлечения данных из стека в тексте программы имеют вид:
POP m16
POP m32
POP r16
POP r32
POP DS
POP ES
POP SS
POP FS
POP GS
m16, m32 – адрес слова и двойного слова соответственно, r16, r32 – имена шестнадцатиразрядных и тридцатидвухразрядных регистров, imm8, imm16, imm32 – 8-разрядные, 16-разрядные, 32-разрядные числа.
2. Описание языка ассемблера
2.1. Алфавит языка ассемблера
Алфавит ассемблера включает в себя следующие символы:
заглавные и строчные буквы латинского алфавита ABCD1FGHIJKLMNOPQRSTUVWXYZ;
арабские цифры;
пробел, горизонтальную табуляцию, возврат каретки;
специальные символы ? @ _$ : . [] () {} < > + - / * & % ! ' ~ " | = # ^ ; * \
2.2. Лексемы
Строка программы на языке ассемблера состоит из комбинации лексем, разделенных пробелом, табуляцией и/или специальным символом, называемым ограничителем.
Лексема - минимальная законченная конструкция языка, принадлежащая определенному классу и получившая после трансляции определенное значение. Лексемы делятся на идентификаторы (имена) и константы. Так, например, константы образуют класс лексем, значением которых является набор битов, отображающих соответствующее число или коды символов.
