АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

МАКРОСЫ

Читайте также:
  1. Ввод-вывод отдельных символов.
  2. Використання макросів
  3. Главное меню
  4. Задание
  5. Знайомство з текстовим процесором Microsoft Word
  6. Инициализация портов
  7. Инструментарий маркетолога
  8. Майстер зведених таблиць Excel і методика створення зведених таблиць різних типів.
  9. Методика створення макросів і приклад їх використання Excel.
  10. Описание среды проектирования Access
  11. Основные функции работы в текстовом режиме

Дан кусочек исходного текста с меткой внутри.

Кусочек может быть абсолютно любой. Например, такой:

mov ax, bx

push eax

m1:

pop edx

jne m1

 

Корректно (ручкой на бумаге) преобразовать его в макрос.

Преобразование фрагмента исходного текста выполняется дописыванием сверху заголовка макроса с ключевым словом MACRO, а снизу – завершителя ENDM. Заголовок может быть, например такой: MyFrag MACRO.

Но «корректно» сздать макрос означает еще и не забыть про внутренние метки. Здесь это метка m1.

Проблема с этими метками состоит вот в чём. Макросы обычно многократно подставляются в программу, они и существуют-то для того, чтобы освободить программиста от повторного написания одинаковых кусков исходного текста. При вызове макроса строчка его вызова заменяется в исходном тексте программы телом макроса, то есть приведенным выше «кусочком». Но сколько раз мы вызовем макрос MyFrag, столько раз и попадет в исходный текст метка m1. Этого допускать нельзя, потому что метка – это адресная константа, численно равная смещению метки в секции кода. Может константа иметь больше одного значения? – Очевидно, что нет. (Простая аналогия. Может на одной улице быть несколько домов с одинаковым номером 14? Как почтальон разберется, в какой из них доставлять письма? Неправильная ситуация, недопустимая). Как же обеспечить уникальность внутренних меток при повторных вставках тела макроса в программу?

Эту работу для нас легко сделает макрогенератор, встроенный в компилятор ML.EXE. Достаточно после заголовка макроса написать LOCAL, и перечислить метки макроса, которые должны обыть в программе уникальными. В нашем случае это LOCAL m1. Окончательно текст макроса получается такой:

MyFrag MACRO

LOCAL m1

mov ax, bx

push eax

m1:

pop edx

jne m1

ENDM

 

 

Написать на бумаге две подстановки этого макроса в программу, показав знание того, как обрабатываются повторные вставки меток.

Для описанных локальних меток макрогенератор при подстановках автоматически генерирует искусственные имена по шаблону??XXXX, где ХХХХ – это запись последовательных чисел в 16-ричном формате от 0000 до FFFF. Имена в ассемблере должны начинаться с буквы, но символы?, _, @ в ассемблере считаются буквами, так что всё в порядке.

При первой подстановке метку «окрестят»??0000, при второй -??0001 и так далее.

Раз так, первая подстановка нашего макроса выглядит так:

mov ax, bx

push eax

??0000:

pop edx

jne??0000

 

Вторая:

mov ax, bx

push eax

??0001:

pop edx

jne??0001

Как видим, в каждой подстановке имя метки разное, что и требовалось.

Вопросы для самопроверки

а) Какой цели служит использование макроса?

б) Что такое «локальная метка в макросе»?

в) Как макрогенератор обеспечивает уникальность локальных меток при повторных вставках макроса?

г) Является ли символ «?» буквой в ассемблере?

 

 


 

ЦИКЛЫ

Ручкой на бумаге описать sz-строку в секции данных.

Любая строка – это массив кодов символов, то есть однобайтных целых чисел. Код символа соответствует изображению выводимого символа. Коды и изображения символов связываются через т.н. кодовые таблицы. Например, код 65 соответствует изображению заглавной английской А.

Чтобы обозначить в памяти конец строки, принято за последней литерой строки ставить байт со значением 0 (ноль-байт). Строки с таким «довеском» называются sz-строками, или ASCIIZ-строками. Расшифровка аббревиатур: «sz» от «String and Zero», «ASCIIZ» от «American Standard Code of Information Interchange with Zero».

Описание строки в секции данных обычное: метка (то есть имя), директива размещения db, перечисление символов строкой и/или числами. Например:


1 | 2 | 3 | 4 | 5 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.)