Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2014- СП 3.0 ЛАБЫ ОБЯЗАТ.doc
Скачиваний:
99
Добавлен:
01.03.2016
Размер:
896 Кб
Скачать
    1. Выполнение работы

Создайте рабочую папку d:\MACRO.

Для наблюдений за работой макрогенератора создадим предельно простой шаблон, еще проще, чем во второй лабораторной работе. Исключим подключение всех inc файлов и библиотек (если их оставить, то это в текстовый исходник добавит ни много, ни мало, а около 40 тысяч строк; здесь нам это совершенно ни к чему, только будут мешать наблюдениям). Итак, наи-наипростейший шаблон:

.486

.MODEL flat, stdcall

; точка1 - место макроопределений

.data

; точка2 - секция данных

.code

; точка3 - секция кода

end

Поместите его в рабочую папку под именем, например, m0.asm.

Второе, что понадобится для удобства работы – пакетный файл, пусть для конкретности он будет называться mg.bat и его мы тоже разместим в рабочей папке:

:: --------------- MG.BAT ----------------

@echo Обрабатывется файл %1.ASM.

@if exist %1.lst del %1.lst

\masm32\bin\ml /EP /nologo %1.asm > %1.lst

@echo.

@echo Результат работы макрогенератора (%1.LST)

@echo -------------------------------------------------

@type %1.lst

@pause

Приступаем к экспериментам.

      1. Макроопределение и макрорасширение

  1. Скопируйте m0.asm в m1.asm и в него, в точку 1, вставить макроопределение mdef MACRO Просто текст mov eax, edx ; обычная команда

;с обычным комментарием ;; Скрытый комментарий push edx ;; обычные pop esi ;; команды endm

  1. В точку 3 вставить макровызов mdef.

  2. Выполнить mg m1. Наблюдать результат. Как отреагировал макрогенератора на строчку «Просто текст»? Наблюдаемое описать в отчете.

  3. Закомментировать строчку «Просто текст», пересохранить m1.asm. Опять выполнить mg m1.

  4. Файлы m1.asm и m1.LST разместить в отчете в двух соседних колонках таблицы, чтобы можно было наглядно сравнивать.

  5. В отчете описать: что произошло при макрорасширении с комментариями обычными (;) и скрытыми (;;); как поступил макрогенератор с другими частями тела макроопределения.

      1. Повторение строк repeat

  1. Скопируйте m0.asm в m2.asm и в него, в точку 2 вставить фрагмент A=1 Massiv Label Word Repeat 10 Dw A*A A = A+1 Endm

  2. Выполнить mg m2. Наблюдать результат.

  3. Файлы m2.asm и m2.LST разместить в отчете в двух соседних колонках таблицы, чтобы можно было наглядно сравнивать.

  4. В отчете описать: что произошло при макрорасширении.

      1. Цикл for

  1. Скопируйте 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

  1. Выполнить mg m3. Наблюдать результат.

  2. Файлы m3.asm и m3.LST разместить в отчете в двух соседних колонках таблицы, чтобы можно было наглядно сравнивать.

  3. В отчете описать: что произошло при макрорасширении.

      1. Анализ расширенного листинга программы

  1. Создайте исходный файл 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

  1. Создайте пакетный файл LstExt.bat такого содержания:

@echo off

echo РАСШИРЕННЫЙ ЛИСТИНГ файла %1

ECHO.

ml /c /coff /Fl%1.ELST /Sa %1

PAUSE

  1. Выполните LstExt coff1.asm. Результаты - это объектный файл coff1.obj и файл расширенного листинга coff1.asm.ELST который в данный момент нас интересует больше всего. Объектный файл нам тоже понадобится, но в следующей лабораторной работе.

  2. Откройте coff1.asm.ELST в Notepad++ (кодировка Кириллица ОЕМ 866). Не удивляйтесь тому, что объем этого текстового файла около полумегабайта, и что он включает «всего-то» 101 тысячу с лишним строчек. Это – следствие подключения всех inc-файлов, скрыто упомянутых в первой строчке coff1.asm, и разворачивания всех попутно попадающихся там макровызовов. Разумеется, нам всёэто в данной работе совершенно не нужно, поэтому надо удалить из coff1.asm.ELST всё лишнее. Открываем поиск Ctrl-F , вводим «ИЗУЧЕНИЕ», «Искать далее», и устанавливаем курсор перед строчкой «; ИЗУЧЕНИЕ ЛИСТИНГОВ». Shift-Ctrl-Home выделит всёдоэтого места. Del. Верхний мусор удалён.

  3. Пролистать листинг вниз, установить курсор в конце строки «end start». Shift-Ctrl-End выделит всё от этого места до конца документа. Del. Нижний мусор также удалён. Сохранить «обрезанный» листинг.

  4. Скопировать в отчет coff1.asm и укороченный coff1.asm.ELST.

  5. Провести сопоставление (ради этого, в общем, всё описываемое здесь и затевалось). Вручную обвести ручкой в исходнике рамочками строчки макровызовов со словами «macrodef», «print» и «invoke». Каждую рамочку снабдить числовой выноской. Такую же работу выполнить в coff1.asm.ELST. То есть снабдить пронумерованными рамочками результаты макрорасширения всех макровызовов.

  6. Сравнить визуально «что писалось в исходнике» с тем, «что поместил в листинг макрогенератор». Письменно прокомментировать и объяснить в отчете наблюдаемое. Особое внимание уделить тому, как передавались параметры макровызовов в макрорасширение и как обрабатываются локальные метки макроопределений при повторных макрорасширениях одного и того же макроопределения.