- •Лабораторная работа № 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. Наблюдение результата работы макрогенератора
3.5 Макроопределение и макрорасширение
Скопируйте m0.asm в m1.asm и в него, в точку 1, вставить макроопределение
mdef MACRO Просто текст mov eax, edx ; обычная команда
;с обычным комментарием ;; Скрытый комментарий push edx ;; обычные pop esi ;; команды endm
В точку 3 вставить макровызов mdef.
Выполнить mg m1. Наблюдать результат. Как отреагировал макрогенератора на строчку «Просто текст»? Наблюдаемое описать в отчете.
Закомментировать строчку «Просто текст», пересохранить m1.asm. Опять выполнить mg m1.
Файлы m1.asm и m1.LST разместить в отчете в двух соседних колонках таблицы, чтобы можно было наглядно сравнивать.
В отчете описать: что произошло при макрорасширении с комментариями обычными (;) и скрытыми (;;); как поступил макрогенератор с другими частями тела макроопределения.
3.6 Повторение строк repeat
Скопируйте m0.asm в m2.asm и в него, в точку 2 вставить фрагмент A=1 Massiv Label Word Repeat 10 Dw A*A A = A+1 Endm
Выполнить mg m2. Наблюдать результат.
Файлы m2.asm и m2.LST разместить в отчете в двух соседних колонках таблицы, чтобы можно было наглядно сравнивать.
В отчете описать: что произошло при макрорасширении.
3.7 Цикл for
Скопируйте m0.asm в m3.asm и в него, в точку 2 вставить фрагмент
massiv label word for y, <1,4,9,16,25> dw y endm
В точку 3 вставить фрагмент For x,<1,3,5,7,9> mov eax, x endm
Выполнить mg m3. Наблюдать результат.
Файлы m3.asm и m3.LST разместить в отчете в двух соседних колонках таблицы, чтобы можно было наглядно сравнивать.
В отчете описать: что произошло при макрорасширении.
3.8 Анализ расширенного листинга программы
Создайте исходный файл coff1.asm такого содержания:
include \masm32\include\masm32rt.inc
; ИЗУЧЕНИЕ РАСШИРЕННОГО ЛИСТИНГА
;< 1. Здесь можно описывать макросы.>
macrodef MACRO par1, par2, par3
LOCAL M3
mov par2, par1 ; обычная команда
;с обычным комментарием
;; Скрытый комментарий
M3:
push par3 ;; обычные
pop par2 ;; команды
endm
.data
;<2. Здесь можно описывать статические переменные. >
Num1 dd 11223344h, 55667788h
Str1 db "ABCDEF", 0
.code
start:
;<3. Здесь можно вводить команды программиста. >
Mov EAX, Num1 ; 11223344
Mov dl, [Str2 + 3] ; J
macrodef EAX, EDX, Num1
.data
;<4. Здесь можно описывать статические переменные. >
Num2 dd 99aabbcch, 0ddeeff00h
Str2 db "GHIJKLM",0
.code
;<5. Здесь можно вводить команды программиста. >
Mov EBX,[Num2 + 4] ; DDEEFF00
Mov dl, [Str1 +4] ; E
macrodef Num2, ESI, EAX
; 6. примеры реальных вызовов макросов и процедур
print "Hello, world!" ; макрос сообщения
;--------------------------------------
invoke ExitProcess,0 ; выход в Windows
end start
Создайте пакетный файл LstExt.bat такого содержания:
@echo off
echo РАСШИРЕННЫЙ ЛИСТИНГ файла %1
ECHO.
ml /c /coff /Fl%1.ELST /Sa %1
PAUSE
Выполните LstExt coff1.asm. Результаты - это объектный файл coff1.obj и файл расширенного листинга coff1.asm.ELST который в данный момент нас интересует больше всего. Объектный файл нам тоже понадобится, но в следующей лабораторной работе.
Откройте coff1.asm.ELST в Notepad++ (кодировка Кириллица ОЕМ 866). Не удивляйтесь тому, что объем этого текстового файла около полумегабайта, и что он включает «всего-то» 101 тысячу с лишним строчек. Это – следствие подключения всех inc-файлов, скрыто упомянутых в первой строчке coff1.asm, и разворачивания всех попутно попадающихся там макровызовов. Разумеется, нам всё это в данной работе совершенно не нужно, поэтому надо удалить из coff1.asm.ELST всё лишнее. Открываем поиск Ctrl-F , вводим «ИЗУЧЕНИЕ», «Искать далее», и устанавливаем курсор перед строчкой «; ИЗУЧЕНИЕ ЛИСТИНГОВ». Shift-Ctrl-Home выделит всё до этого места. Del. Верхний мусор удалён.
Пролистать листинг вниз, установить курсор в конце строки «end start». Shift-Ctrl-End выделит всё от этого места до конца документа. Del. Нижний мусор также удалён. Сохранить «обрезанный» листинг.
Скопировать в отчет coff1.asm и укороченный coff1.asm.ELST.
Провести сопоставление (ради этого, в общем, всё описываемое здесь и затевалось). Вручную обвести ручкой в исходнике рамочками строчки макровызовов со словами «macrodef», «print» и «invoke». Каждую рамочку снабдить числовой выноской. Такую же работу выполнить в coff1.asm.ELST. То есть снабдить пронумерованными рамочками результаты макрорасширения всех макровызовов.
Сравнить визуально «что писалось в исходнике» с тем, «что поместил в листинг макрогенератор». Письменно прокомментировать и объяснить в отчете наблюдаемое. Особое внимание уделить тому, как передавались параметры макровызовов в макрорасширение и как обрабатываются локальные метки макроопределений при повторных макрорасширениях одного и того же макроопределения.
