- •Лабораторная работа № 4
- •Цель работы
- •Краткие сведения из теории На что опирается программирование на ассемблере
- •Состав пакета масм
- •Последовательность создания исполняемого ехе-модуля на масм
- •Режимы компоновки
- •Макроопределение и макрорасширение
- •Параметризация макросов
- •Уникальность меток при макрорасширениях
- •Макроконстанты
- •Макропеременные и макровычисления
- •Увидеть работу макрогенератора
- •Расширенный листинг
- •3. Порядок выполнения работы:
- •3.1 Создание консольной программы
- •3.2 Создание программы с графическим интерфейсом
- •3.3 Использование шаблона простой программы
- •3.5 Макроопределение и макрорасширение
- •3.6 Повторение строк repeat
- •3.7 Цикл for
- •3.8 Анализ расширенного листинга программы
- •4. Содержание отчёта
- •5. Вопросы к защите
- •Самостоятельная работа по лабораторной работе № 4 «Технология создания ассемблерных программ»
- •1. Установка масм32
- •2. Настройка переменной path
- •7. Превращение участка кода в макрос
- •8. Просмотр работы макрогенератора
- •9. Параметризация макроса
- •10. Локализация внутренних меток в макросах
- •11. Макроимена и макропеременные
- •12. Превратить исходный текст в макрос
- •13. Ручное макрорасширение
- •14. Наблюдение результата работы макрогенератора
7. Превращение участка кода в макрос
Если при написании программы вы обнаружили, что определенный кусок кода встречается в программе больше двух-трех раз, то этот кусок вполне можно описать как макрос, а потом просто вставлять этот макрос в исходник.
Дан кусок кода. Никаких дополнительных требований к нему не предъявляется. Например, такой.
Mov eax, ebx
Push eax
Jmp b1
Превращаем этот фрагмент в макрос. Сверху дописываем заголовок макроса M1 MACRO, снизу – завершитель ENDM.
M1 MACRO
Mov eax, ebx
Push eax
Jmp b1
ENDM
8. Просмотр работы макрогенератора
Разместите в d:\masm32\bin пакетный файл LST.bat:
:: Получение листинга
@echo off
echo Вид исходника после макрогенератора
ml /EP %1 > %1.LST
pause
Создайте файл ma.asm:
M1 MACRO
Mov eax, ebx
Push eax
Jmp b1
ENDM
include \masm32\include\masm32rt.inc
.code
start:
M1
;---------------------------
M1
;---------------------------
M1
;---------------------------
end start
Выполните lst ma.asm. Создастся файл листинга ma.asm.LST. Интересующий нас участок находится в самом конце, после строки 50375. Смотрим результат макрорасширения.
9. Параметризация макроса
Изменить макрос М1 таким образом, чтобы вместо жёстко указанных в нем имен eax и ebx можно было бы указывать любые другие строки-параметры.
Вместо трёх вызовов М1 без параметров написать три вызова с разными параметрами.
Пересоздать ma.asm.LST , просмотреть результат макрорасширений.
10. Локализация внутренних меток в макросах
Вставьте в макрос М1 какую-нибудь метку, всё равно какую, например metka22: .
Пересоздать ma.asm.LST , просмотреть результат макрорасширений.
По ссылке http://msdn.microsoft.com/en-us/library/ebwyd354%28v=vs.71%29.aspx посмотрите, что означает ошибка «error A2005», и объясните причину ее появления.
После заголовка макроса М1 вставьте строку LOCAL metka22.
Пересоздать ma.asm.LST , просмотреть результат макрорасширений.
Сравнить полученный результат макрорасширений с предыдущим, объяснить наблюдаемое.
11. Макроимена и макропеременные
Придать исходнику ma.asm следующий вид:
M1 MACRO h1, h2
LOCAL metka22
Mov h1, h2
metka22:
Push h1
Jmp b1
ENDM
NameVar equ Variable2
include \masm32\include\masm32rt.inc
.code
start:
A=5
NameVar equ NewName
;-----------extention1------
M1 eax, A
;-----------extention2------
A=A+1
M1 NameVar, A
;-----------extention3------
A=20*A
M1 NewName, A
;---------------------------
end start
Пересоздать ma.asm.LST , просмотреть результат макрорасширений. Объяснить, как макрогенератор обрабатывает директивы equ и = .
12. Превратить исходный текст в макрос
Дан кусочек исходного текста с меткой внутри. Корректно преобразовать его в макрос.
13. Ручное макрорасширение
Макрос из задания 12 дважды подставить в программу, показав знание того, как обрабатываются повторные вставки меток.
14. Наблюдение результата работы макрогенератора
Действия по п.12 и 13 превратить в примитивный asm-модуль. Получить на компьютере листинг этого модуля. Показать, как выполнились макрорасширения. Объяснить наблюдаемый результат.
