- •Введение
- •Сведения об архитектуре процессоров 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
- •Оглавление
. Компиляция
Файл с текстом на языке ассемблера должен иметь расширение asm. Компиляция как консольных, так и графических программ осуществляется программой tasm32.exe. Для системы программирования, представляющую собой совокупность консольных программ, существуют многочисленные графические оболочки. Мы сознательно в учебных целях будем пользоваться командной строкой, а разработка оболочки на ассемблере будет заданием, завершающим знакомство с ассемблером для программирования под Windows. Командную строку удобно держать в командном файле (расширение bat) в своем рабочем каталоге. Допустим, что мы вызываем компилятор, который находится на диске С в каталоге tasm5. Командная строка для того и другого приложения будет иметь вид:
C:\tasm5\bin\tasm32 /ml /zi /l <имя_файла>
где bin – подкаталог в каталоге tasm5
tasm32 – имя компилятора
/ml – обязательный ключ, заставляющий компилятор различать верхний и нижний регистры
/zi – необязательный ключ, заставляющий компилятор сохранять отладочную информацию
/l - необязательный ключ, заставляющий компилятор сохранить листинг трансляции в файле с расширением lst.
В результате компиляции, если в тексте не было ошибок, будет получен файл с расширением obj.
3.2. Компоновка
Для компоновщика исходным файлом является объектный файл. Командная строка будет содержать разные ключи в зависимости от характера приложения. По умолчанию получится консольное приложение.
C:\tasm5\bin\tlink32 /v <имя_файла>,,, C:\tasm5\lib\import32
Для графического приложения приведем командный файл для программы 2, т.е. для приложения с файлом ресурсов:
c:\tasm500\bin\tlink32 /v/aa Mymenu2,,,c:\tasm500\lib\ import32, ,Mymenu2
где bin – подкаталог в каталоге tasm5
tasm32 – имя компилятора
/v - необязательный ключ, заставляющий компоновщик сохранять отладочную информацию
/aa - ключ, заставляющий компоновщик получить графическое приложение
Mymenu2- имя объектного файла
Вторая и третья запятые означают, что мы согласны с тем, что имя исполняемого файла(exe) и файла карты загрузки(map) будет таким, как и у объектного файла.
Следующая затем часть командной строки указывает путь к библиотеке импорта. Пустое место между запятыми означает, что мы проигнорировали файл проекта. На последнем месте стоит имя файла ресурсов, который должен иметь расширение res и может быть получен с помощью компилятора ресурсов brcc32 из подкаталога bin.
В результате компоновки получится исполняемый файл с расширением exe.
Библиографический список
1. Пирогов В. Ю. Ассемблер для Winlfws. - СПб.: БХВ-Петербург, 2005. 864с.
Петзолд Ч. Прогаммирование для Windows 95. Том Санкт-Петербург. BVH, 1997. 752 с.
Текстовый и графический интерфейсы пользователей в операционной системе общего назначения: Методические указания к лабораторному практикуму по дисциплине "Системное программное обеспечение" /В.П. Кулюкин.- Екатеринбург: изд. УГТУ-УПИ, 2005.-88 с. Екатеринбург: изд. ИПК УГТУ, 2000. 52 с.
Юров В. Assembler: Специальный справочник. 2-е изд. СПб.: Питер, 2004. 412 с.
Управление памятью: Методические указания к лабораторному практикуму по дисциплинам "Операционные системы", "Системное программное обеспечение" /В.П. Кулюкин.- Екатеринбург: изд. УГТУ-УПИ, 2009.-64 с.
Рудаков П.И. Язык ассемблера: уроки программирования /П.И. Рудаков, К.Г. Финогенов. – М.: ДИАЛОГ-МИФИ, 2001. 640 с.
Чекатков А.А. Использование Turbo Assembler для разработки программ. – Киев: "Диалектика", 1995. 288 с.
Приложение 2
Директивы ассемблера
Синтаксис |
Описание |
.186 |
Допустимы команды 8086, 80186 |
.286С |
Допустимы команды 80286, 8086 |
.286Р |
Допустимы привелегированные команды 80286 |
.287 |
Допустимые команды 8087, 80287 |
.8086 |
Допустимые команды 8086 |
.8087 |
Допустимые команды 8087 |
<имя>=<выражение> |
присваивает значению выражения символическое имя |
ASSUME segreg:segname,... |
описание содержимого регистровсегментов по умолчанию |
COMMENT <ограничитель> <текст> <ограничитель> |
указанный текст трактуется как комментарий |
.CREF |
формировать файл перекрестныхссылок |
[<имя>] DB <значение> |
распределение и инициализация байта памяти |
[<имя>] DW <значение> |
распределение и инициализация 2х байтов памяти |
[<имя>] DD <значение> |
распределение и инициализация 4хбайтов памяти |
[<имя>] DQ <значение> |
распределение и инициализация 8 байтов памяти |
[<имя>] DT <значение> |
распределение и инициализация 10 байтов памяти |
ELSE |
начало условного альтернативного блока |
END [<имя>] |
конец модуля и определение адреса точки входа |
ENDIF |
конец условного альтернативного блока |
ENDM |
конец макроопределения |
<имя> ENDP |
конец процедуры |
<имя> ENDS |
конец сегмента или описания шаблона структуры |
<имя> EQU <выражение> |
присваивает значению выражения символическое имя |
.ERR |
генерация ошибки |
.ERR1 |
генерация ошибки 1-го прохода |
.ERR2 |
генерация ошибки 2-го прохода |
.ERRB<аргумент> |
генерация ошибки, если аргументом является пробел |
.ERRDEF <имя> |
генерация ошибки, если имя было ранее определено как метка или переменная |
.ERRE <выражение> |
генерация ошибки, если выражение ложно (0) |
.ERRDIF <стр1>.<стр2> |
генерация ошибки, если строки различны |
Продолжение приложения 2
.ERRIDN <стр1>.<стр2> |
генерация ошибки, если строки идентичны |
.ERRNB<аргумент> |
генерация ошибки, если аргументом не является пробел |
.ERRNDEF <имя> |
генерация ошибки, если имя не было ранее определено |
.ERRNZ <выражение> |
генерация ошибки, если выражение истино |
EVEN |
установка указателя позиции на четный адрес |
EXITM |
выход из текущего макроопределения |
EXTRN <имя>:<тип> |
определение внешних имен |
<имя> GROUP <имя сегм.> |
определение имени группы сегментов |
IF <выражение> |
ассемблировать, если выражение истино |
IF1 |
ассемблировать при 1-м проходе |
IF2 |
ассемблировать при 2-м проходе |
IFB |
ассемблировать, если аргументом является пробел |
IFDEF <имя> |
ассемблировать, если имя было ранее определено как метка |
IFDIF <арг.1>,< арг.2 > |
ассемблировать, если аргументы различны |
IFE <выражение> |
ассемблировать, если выражение истино |
IFIDN <арг.1>,< арг.2 > |
ассемблировать, если аргументы идентичны |
IFNB <аргумент> |
ассемблировать, если аргументом не является пробел |
IFNDEF <имя> |
ассемблировать, если имя еще не определено |
INCLUDE <имя файла> |
Включить при ассемблировании текст файла |
IRP<форм.имя>,<параметры> |
блок повторения: формальное имя последовательно принимает значения параметров |
IRC<форм.имя>,<параметры> |
блок повторения: формальное имя последовательно принимает значения символьных параметров |
<имя> LABEL <тип> |
создать в текущей позиции новую переменную или метку |
.LALL |
печатать макрорасширения |
.LFCOND |
восстановить листинг условных блоков |
.LIST |
восстановить листинг программы |
LOCAL <форм.имя>,…. |
объявление формальных имен в макро |
<имя>MAKRO<форм.парам.> |
начало макроопределения |
NAME <имя> |
изменить имя текущего модуля |
PURGE <имя макро> |
удалить макро |
ORG <выражение> |
установить указатель позиции |
%OUT<текст> |
выдать текст на терминал |
Продолжение приложения 2
<имя> PROC <тип > |
начало процедуры |
PAGE <длина>,<ширина> |
установка параметров листинга |
PAGE+ |
переход на новую секцию листинга |
PAGE |
переход на новую страницу листинга |
PUBLIC <имя> |
определение общих имен |
.RADIX <выражение> |
установить систему исчисления по умолчанию |
<имя> RECORD <поле>,… |
описание шаблона записи для 8 или 16 – битовых записей |
REPT |
начало блока повторения |
.SALL |
подавить вывод макрорасширений |
<имя> SEGMENT <атриб.> |
начало сегмента |
.SFCOND |
подавить вывод условных блоков с ложными условиями |
<имя> STRUC |
начало шаблона структуры |
SUBTTL <текст> |
установить подзаголовок листинга |
.IFCOND |
установить режим печати условных блоков |
TITLE <текст> |
установить заголовок листинга |
.XALL |
выводить только те предложения в макро, по которым генерируется код или данные |
.XCREF |
подавить таблицу перекрестных ссылок |
.XLIST |
подавить листинг исходного файла |
Приложение 3
