Меню сайта

Урок 101. Аргументы макрокоманд

В обработке макрокоманд применяется одноиз ценных свойств
— — — процедур: в генерацию макрокоманды можновносить изменения с
— — — помощью параметров. Точно так же, какпараметры подпрограммы могут
— — — влиять на ее выполнение, параметрымакрокоманды определяют
— — — фактически генерируемые команды. И так же,как и процедуры,
— — — макрокоманды без параметров встречаютсяотносительно редко.

— — — — — Рассмотрим еще один простой пример. Мысоставили программу так,
— — — что во многих ее местах содержимоеопределенной ячейки памяти
— — — складывается с различными константами.Вместо того, чтобы много раз
— — — писать команду

— — — — — ADD MEMORY_BYTE,5
— — — — — или
— — — — — ADD MEMORY_BYTE,7


— — — нам хотелось бы воспользоваться для неесоответствующей
— — — макрокомандой. Однако во всех приведенныхкомандах константы
— — — разные. Поэтому мы сделаем константупараметром макрокоманды. На
— — — Фиг. 6.2 показаны определение и применениемакрокоманды ADDBYTE. В
— — — этом примере в качестве параметра вопределении макрокоманды
— — — используется символическое имя CONSTANT.Любые символичесике имена,
— — — появляющиеся в поле операнда оператораMACRO, интерпретируются как
— — — параметры. В момент определениямакрокоманды у имени CONSTANT нет
— — — никакого значения: оно просто резервируетместо в тексте
— — — макрокоманды. Позднее, при вызове иобработке текста макрокоманды,
— — — вместо символического имени в определениимакрокоманды
— — — подставляется определенное значениепараметра.
— — — — — Важно отметить, что параметр макрокоманды- это текстовый
— — — параметр. Так как макропроцессорфактически является текстовым
— — — процессорорм, то он не отличает цифры отбукв и наоборот. Это
— — — позволяет при вызове макрокомандыиспользовать вместо чисел
— — — символические имена. Любой смыслприписывается символьной строке не
— — — макропроцессором, а ассемблером.Макропроцессор подставляет

— — — — — — — — — -Microsoft (R) Macro Assembler Version 5.00 — — — — — — — — — — — — 1/1/80 04:02:43
— — — — — — — — — -Фиг. 6.2 Макрокоманда с аргументом — — — — — — — — — — — — — — Page — — — — — — — 1-1


— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — PAGE — — -,132
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — TITLE — -Фиг. 6.2 Макрокоманда с аргументом

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ADDBYTE MACRO — — CONSTANT
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ADD — — — -MEMORY_BYTE, CONSTANT
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ENDM

— — — — — — — — — — -0000 — — — — — — — — — — — — — — — — — CODE — — -SEGMENT
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ASSUME -CS:CODE

— — — — — — — — — — -0000 — ?? — — — — — — — — — — — — -MEMORY_BYTE — — — — DB — — — — -?

— — — — — — — — — — -= 0004 — — — — — — — — — — — — — — — — — — — — — FOUR — — — — — — EQU — — — -4 — — — — — — — Симвользое изображение константы

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ADDBYTE — — — — — — — — — 2
— — — — — — — — — — -0001 — 2E: 80 06 0000 R 02 — — 1 — — — — — — — — — — ADD — — — -MEMORY_BYTE, 2
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ADDBYTE — — — — — — — — — 4
— — — — — — — — — — -0007 — 2E: 80 06 0000 R 04 — — 1 — — — — — — — — — — ADD — — — -MEMORY_BYTE, 4
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
— — — ADDBYTE — — — — — — — — — FOUR
— — — — — — — — — — -000D — 2E: 80 06 0000 R 04 — — 1 — — — — — — — — — — ADD — — — -MEMORY_BYTE, FOUR

— — — — — — — — — — -0013 — — — — — — — — — — — — — — — — — CODE — — -ENDS
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — END

— — — — — — — — — — — Фиг. 6.2 Аргументы макрокоманды

— — — текстовую строку из вызова макрокоманды наместо символического
— — — имени в определении макрокоманды. Такимобразом программа может
— — — использовать константное значение»FOUR» с тем же успехом, что и
— — — константу «4».

— — — — — Возможность использовать символическиеимена в качестве
— — — параметров макрокоманд принципиально важнадля следующего примера
— — — макрокоманды. Этой макрокоманда, одной изкоманд сопроцессора 8087,
— — — требуется параметр, который при обычном ееиспользовании почти
— — — всегда бывает символическим именем.Макрокоманда FLDCW — это
— — — команда сопроцессора 8087, которая задаетячейку памяти. Так как в
— — — программах на языке ассемблера вбольшинстве случаев обращаются к
— — — ячейкам памяти с помощью символическихимен, то желательно
— — — сохранить этот способ и дляпрограммирования сопроцессора 8087.

— — — — — На Фиг.6.3 приводится макрокоманда FLDCW инесколько обрашений
— — — к ней. Заметьте, что макрокоманда FLDCWиспользует в качестве
— — — параметра символическое имя»SOURCE». Параметр SOURCE является
— — — адресом, с которого сопроцессор 8087загружает управляющее слово.
— — — Для генерации требуемого машинного кодамакрокоманда FLDCW
— — — использует команду 8088 ESC. Однако длятого, чтобы определить байт
— — — mod=r/m команды, команде ESC требуетсязначение адреса. Как раз для

— — — — — — — — — — -Microsoft (R) Macro Assembler Version 5.00 — — — — — — — — — — — — 1/1/80 04:02:47
— — — — — — — — — — -Фиг. 6.3 Макрокоманда для команды FLDCW — — — — — — — — — — — — — — — Page — — — -1-1


— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — PAGE — — -,132
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — TITLE — -Фиг. 6.3 Макрокоманда для команды FLDCW

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — FLDCW — -MACRO — — SOURCE
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — DB — — — — -09BH
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ESC — — — -0DH, SOURCE
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ENDM

— — — — — — — — — — — 0000 — — — — — — — — — — — — — — — — — — — CODE — — -SEGMENT
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ASSUME -CS:CODE

— — — — — — — — — — — 0000 — ???? — — — — — — — — — — — — — MEMORY_LOCATION DW — — — — — ?

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — FLDCW — -MEMORY_LOCATION
— — — — — — — — — — — 0002 — 9B — — — — — — — — — — — — 1 — — — — — — DB — — — — -09BH
— — — — — — — — — — — 0003 — 2E: D9 2E 0000 R — — — — 1 — — — — — — ESC — — — -0DH, MEMORY_LOCATION
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — FLDCW — -ES:[DI]
— — — — — — — — — — — 0008 — 9B — — — — — — — — — — — — 1 — — — — — — DB — — — — -09BH
— — — — — — — — — — — 0009 — 26: D9 2D — — — — -1 — — — — — — ESC — — — -0DH, ES:[DI]
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -&
nbsp- FLDCW — -MEMORY_LOCATION[BX+SI]
— — — — — — — — — — — 000C — 9B — — — — — — — — — — — — 1 — — — — — — DB — — — — -09BH
— — — — — — — — — — — 000D — 2E: D9 A8 0000 R — — — — 1 — — — — — — ESC — — — -0DH, MEMORY_LOCATION[BX+SI]

— — — — — — — — — — — 0012 — — — — — — — — — — — — — — — — — — — CODE — — -ENDS
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — END

— — — — — — — — — — — Фиг. 6.3. Макрокомнда FLDCW

— — — этого макрокоманда и использует параметрSOURCE. Такая организация
— — — макрокоманды FLDCW позволяетпрограммировать весьма естественным
— — — способом. Точно так же как пишется

— — — — — INC MEMORY_LOCATION

— — — вы можно написать команду для сопроцессора8087

— — — — — FLDCW MEMORY_LOCATION

— — — — — Это справедливыо не только для адресов,заданных символическими
— — — именами, но и для других способовадресации. На Фиг. 6.3 показано
— — — несколько примеров задания операнда спомощью адресации по базе и
— — — индексу. Так как макропроцессорвоспринимает параметр как какой-то
— — — фрагмент текста, то параметр может бытьобразован любой символьной
— — — строкой, какую вы пожелаете.

— — — — — Можно задать макрокоманду и с несколькимипараметрами.
— — — Единственное, что ограничивает числопараметров макрокоманды, это
— — — длина ассемблерной строки. Все, чтоследует за оператором MACRO
— — — интерпретируется макропроцессором какпараметр. Для разделения
— — — символических имен в определениимакрокоманды пользуются запятыми.
— — — Оператор MACRO с тремя параметрами будетвыглядеть следующим
— — — образом:

— — — — — EXAMPLE MACRO ARG1, ARG2, ARG3

— — — Аналогично, при вызове макрокоманды выдолжны задать значение
— — — каждого из параметров. Если вы хотитепропустить какой-то параметр,
— — — то ассемблер подставит вместо негосимвольную строку нулевой длины.
— — — Иногда это полезно, но часто приводит кнеправильной трансляции.
— — — Если макрокоманда имеет более одногопараметра, то при вызове
— — — макрокоманды относящийся к параметрамтекст разделяется запятыми.
— — — Это в точности совпадает со способомзадания нескольких параметров
— — — к любой из команд микропроцессора 8088,поэтому будет вполне
— — — естественным для вас. Вызов макрокоманды стремя параметрами может
— — — выглядеть так:

— — — — — — — — -EXAMPLE 5, [BX], MEMORY_BYTE

— — — В следующемпримере вы увидите некоторые возможности множествен-
— — — ности параметров.

Категория: Программирование на Ассемблере | Дата: 21.03.13

Меню раздела
Блок