|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
МАКРОСЫДан кусочек исходного текста с меткой внутри. Кусочек может быть абсолютно любой. Например, такой: 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, перечисление символов строкой и/или числами. Например: Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.) |