Макросы ассемблер: Основы создания макросов в Assembler.

Содержание

Основы создания макросов в Assembler.

Основы создания макросов в Assembler. — it-black.ru Перейти к содержимому

Макросы — это шаблоны для генерации кода. Один раз создав макрос, можно использовать его во многих местах в коде программы. Макросы делают процесс программирования на ассемблере более приятным и простым, а код программы получается понятнее. Макросы позволяют расширять синтаксис ассемблера и даже добавлять собственные «команды», которых нет в процессоре.

Также Макросы могут использоваться для ускорения разработки программного обеспечения для микроконтроллеров на Assembler. В процессе компиляции Макросы заменяются на последовательности команд микроконтроллера. Подобный подход к программированию позволяет приблизить программирование на Assembler по внешнему виду к языку программирования C.

Синтаксис создания макроса

Для создания макроса используется директива macro.

Эта директива имеет следующий синтаксис:


macro  []
{
    
}

После директивы пишется название макроса, а также может быть указан список параметров (операндов). Параметры в списке перечисляются через запятую. Внутри фигурных скобок записывается тело макроса.

Тело макроса — это код, который подставляется в то место, где макрос будет вызван. Создание макроса является по сути лишь его объявлением, в этом месте программы никакого кода сгенерировано не будет. Поэтому объявления макросов обычно размещают в самом начале программы или в отдельном файле. Примеры макросов:


; Простой макрос без параметров, предназначенный для завершения программы
macro exit_app
{
    mov ax,4C00h
    int 21h
}

После того, как макрос объявлен, в нужном месте программы достаточно написать exit_app. Туда препроцессор FASM автоматически подставит 2 команды, записанные в теле макроса.

Расширение системы команд

Макросы можно использовать для расширения системы команд. Например, часто в программе приходится обнулять регистры. Создадим специальный макрос для этой цели:


; Макрос - команда обнуления регистра
macro clr reg { xor reg,reg }

Теперь обнулять регистры в программе можно так:


    clr ax          ;AX=0
    clr si          ;SI=0
    clr bl          ;BL=0
Директива include

Если нужно написать собственный набор макросов и использовать их в своих программах, то будет удобно поместить макросы в отдельный файл и воспользоваться директивой включения файла include. Синтаксис директивы:


include 'путь/к/файлу'

Путь к файлу указывается в одинарных кавычках и может быть относительным (по отношению к компилируемому файлу) или полным (начиная от буквы диска или корневого каталога системы). Если включаемый файл находится в той же папке, то достаточно указать только имя файла. Расширение файла может быть любым, но обычно используют «inc» или «asm».

Препроцессор FASM читает указанный файл и подставляет код из него вместо директивы include. В отдельный файл можно также вынести часто используемые процедуры, отдельные функциональные блоки программы или объявления данных.

Макросы с переменным количеством параметров

Возможно также создавать макросы с переменным количеством параметров. В этом случае имя параметра записывается в квадратных скобках. Для генерации кода макрос вызывается столько раз, сколько параметров ему было передано. Например, можно написать специальные макросы для улучшения команд PUSH и POP:


; Макрос - улучшенная команда push
macro push [arg] { push arg }
; Макрос - улучшенная команда pop
macro pop [arg] { pop arg }

Несмотря на то, что название макроса совпадает с именем команды, в теле макроса это имя считается именем команды. Данные макросы позволяют помещать в стек и извлекать из стека сразу несколько операндов, что упрощает код программы. Пример использования:


    push ax,word[si],5
    pop  dx,cx,ax

В результате препроцессором будет сгенерирован следующий код:


    push ax
    push word[si]
    push 5
    pop dx
    pop cx
    pop ax

Facebook

Twitter

  • No Comments

Группа в VK

Обнаружили опечатку?

Сообщите нам об этом, выделите текст с ошибкой и нажмите Ctrl+Enter, будем очень признательны!

Свежие статьи

Облако меток

Похожие статьи

Команды работы с битами.

Работать с отдельными битами операндов можно, используя логические операции и сдвиги. Также в системе команд x86 существуют специальные команды для работы с битами: это команды

Синтаксис объявления меток.

Метка в ассемблере – это символьное имя, обозначающее ячейку памяти, которая содержит некоторую команду. Метка может содержать следующие символы: Буквы (от A до Z и

Локальные переменные.

Локальные переменные в Assembler используются для хранения промежуточных результатов во время выполнения процедуры. В отличие от глобальных, эти переменные являются временными и создаются при запуске

Передача параметров через стек.

В предыдущих уроках все параметры передавались процедурам через регистры. В этой статье мы рассмотрим другой способ — передачу параметров через стек. Часто этот способ оказывается

Instagram Vk Youtube Telegram Odnoklassniki

Полезно знать

Рубрики

Авторы

Определение блоков __asm как макросов C

Twitter LinkedIn Facebook Адрес электронной почты

  • Статья

Блок, относящийся только к системам Microsoft

Макросы C предоставляют удобный способ вставки кода сборки в исходный код, но они требуют особой осторожности.

поскольку макрос расширяется в одну логическую строку. Для создания безотказных макросов следуйте правилам ниже.

  • Заключайте блок __asm в фигурные скобки.

  • Помещайте ключевое слово __asm перед каждой инструкцией по сборке.

  • Используйте комментарии на языке C старого стиля (/* comment */) вместо комментариев в стиле сборки (; comment) или однострочных комментариев С (// comment).

Чтобы проиллюстрировать вышесказанное, в следующем примере определяется простой макрос.

#define PORTIO __asm      \
/* Port output */         \
{                         \
   __asm mov al, 2        \
   __asm mov dx, 0xD007   \
   __asm out dx, al       \
}

На первый взгляд три последние ключевые слова __asm кажутся излишними. Однако они нужны, поскольку макрос развертывается в одну строку.

__asm /* Port output */ { __asm mov al, 2  __asm mov dx, 0xD007 __asm out dx, al }

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

Очень важно использовать фигурные скобки. Если опустить их, компилятор может перепутать операторы С и C++ на одной строке справа от вызова макроса. Без закрывающей фигурной скобки компилятор не может определить, где завершается код сборки и где начинаются операторы C или С++ после блока __asm в качестве инструкций по сборке.

Комментарии в стиле сборки, начинающиеся точкой с запятой (;), продолжаются до конца строки. Это вызывает проблемы с макросами, поскольку компилятор игнорирует все после комментария вплоть до конца логической строки. То же самое можно сказать об однострочных комментариях C или C++ (// comment). Во избежание ошибок используйте комментарии на языке C старого стиля (/* comment */) в блоках __asm, определенных как макросы.

Блок __asm, записанный в качестве макроса С, может принимать аргументы. В отличие от обычного макроса C, однако, макрос __asm не может возвращать значение. Невозможно использовать такие макросы в выражениях С или С++.

Следует с особой тщательностью вызывать макросы этого типа. Например, вызов макроса на языке сборки в функции, объявленной с соглашением

__fastcall, может дать неожиданные результаты. (См. раздел Использование и сохранение регистров во встроенной сборке.)

Завершение блока, относящегося только к системам Майкрософт

Встроенный ассемблер

AVR Tutorials — Ассемблерные макросы

Ассемблерные макросы могут быть мощными инструментами, позволяющими повторно использовать последовательности кода снова и снова. Создание библиотеки макросов для наиболее часто используемых функций позволит вам писать код быстрее и делать меньше ошибок.

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

Определение макросов

Макросы определяются размещением кода между директивами ассемблера .macro и .endmacro. Например, макрос myMacro может быть определен как

 .macro мой макрос
... ; код макроса
.endmacro
 

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

 .macro setStack
ldi r16, НИЗКИЙ (RAMEND)
вне SPL, r16
ldi r16,ВЫСОКИЙ(РАМЕНД)
выход SPH,r16
.endmacro 

После определения макроса его можно использовать, просто поместив имя макроса в код

 запуск: setStack ; инициализировать указатель стека

. .. ; программный код

петля: rjmp петля ; бесконечный цикл 

Передача параметров в макросы

Можно писать макросы, которые принимают параметры. При написании кода для такого макроса первый передаваемый параметр представляется как @0, второй — как @1, третий — как @2 и т. д. Например, приведенный выше макрос можно переопределить, чтобы он принимал параметр для использования в качестве адреса указателя стека.

 .macro setStack
лди r16,НИЗКИЙ(@0)
вне SPL, r16
лди r16,ВЫСОКИЙ(@0)
выход SPH,r16
.endmacro 

Затем этот макрос можно использовать как

 start: setStack RAMEND ; инициализировать указатель стека

... ; программный код

петля: rjmp петля ; бесконечный цикл 

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

 .macro setStack
лди @1,НИЗКИЙ(@0)
вне SPL,@1
ldi @1,ВЫСОКИЙ(@0)
выход SPH,@1
.endmacro 

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

 запуск: setStack RAMEND,r16 ; инициализировать указатель стека

... ; программный код

петля: rjmp петля ; бесконечный цикл 

Условные директивы и обработка ошибок

Условные директивы можно использовать для повышения гибкости ваших макросов и отлова ошибок. Существует ряд условных директив и выходов, которые вы можете использовать, они показаны в таблице ниже.

Директива Описание
.еще еще
.элиф иначе если
.если если
.ifdef, если определено
.ifndef, если не определено
.ошибка выдает ошибку
.сообщение вывести сообщение
.предупреждение вывести предупреждение

Например, вы можете включить проверку того, что переданный параметр находится в допустимом диапазоне.

 .macro setStack
.if @0>РАМЕНД
.error "Значение больше, чем RAMEND, используемое для установки стека"
.еще
лди @1,НИЗКИЙ(@0)
вне SPL,@1
лди @1,НИЗКИЙ(@0)
вне SPL,@1
.endif
.endmacro
 

Теперь, если используется значение больше, чем RAMEND устройства, ассемблер выдаст ошибку и выведет сообщение в командной строке, указывающее, в чем была проблема.

Объединение макросов и подпрограмм

Помещая вызовы подпрограмм в определения макросов, мы можем создавать более гибкие и простые в использовании подпрограммы.

Например, подпрограмма delay10ms, которую мы написали ранее, требовала загрузки параметра во входной регистр перед ее вызовом. Мы можем просто сделать эту часть макроса, чтобы подпрограмма задержки могла вызываться в одной строке. Кроме того, мы можем сохранить регистры, которые, как мы знаем, будет изменять подпрограмма, поместив их в стек и восстановив их после завершения.

 .макрос задержки
толчок r18
толчок r24
толчок р25

ldi r18,@0/10
задержка повторного вызова10 мс

поп r25
поп r24
поп r18
. endmacro
 

Теперь нашей подпрограммой стало намного проще пользоваться.

 задержек 500 ; задержка на 500 мс 

Обратите внимание, что входной параметр для задержки 10 мс показывает, сколько раз мы задержимся на 10 мс. Например, для задержки на 1 с нам пришлось бы передать параметр 100. Разделив его на 10 в макросе выше, мы абстрагировались от этой детали. Макрос позволяет нам просто вызвать подпрограмму с количеством мс, которое мы хотим отложить.

Если вы будете использовать макрос во многих различных программах, вы можете создать новый файл, чтобы поместить макрос и включить его во все программы, которые в нем нуждаются. Например, в файл delayMacro.inc можно поместить следующее.

 ;****************************************************** ***************
;* макрос: delayms
;*
;* описание: создает задержку на указанное количество
;* миллисекунды
;*
;* inputs: @0 - количество миллисекунд задержки для
;*
;* регистры изменены: нет
;****************************************************** *************

. макрос задержки
толчок r18
толчок r24
толчок р25

ldi r18,@0/10
задержка повторного вызова10 мс

поп r25
поп r24
поп r18
.endmacro
 

Используя это, нашу программу из предыдущего примера можно еще больше упростить.

 .include "m328pdef.inc"
.include "delayMacro.inc"

маска .def = r16 ; регистр маски
.def ledR = r17 ; светодиодный регистр
.def loopCt = r18 ; количество циклов задержки

.equ iVal = 39998 ; значение внутреннего цикла

.cseg
.org 0x00
ldi r16, НИЗКИЙ (RAMEND) ; инициализировать
выход SPL,r16 ; указатель стека
ldi r16,ВЫСОКИЙ(РАМЕНД) ; в РАМЕНД
выход SPH,r16 ; "

клр светодиодR ; очистить светодиодный регистр
ldi маска,(1< asm" ; включить подпрограмму задержки

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


<< Предыдущая

Следующая >>

Макросы

Макросы

Макрос является расширением базового языка ASSEMBLER. Они предоставляют средство для генерации обычно используемой последовательности ассемблера инструкции/заявления. Последовательность инструкций/операторов будет быть закодирован ОДИН раз в определении макроса. Всякий раз, когда последовательность необходимо внутри программы, макрос будет «вызван».

Определение макроса предшествует всем CSECT и DSECT. Он состоит из четырех части:

  1. Макроинструкция MACRO, начинающаяся в столбце 10

  2. Оператор прототипа (в этой строке указывается имя макроса и аргументы, которые он принимает)

  3. Корпус макроса

  4. Макроинструкция MEND, начинающаяся в столбце 10

MACRO сигнализирует о начале определения макроса.

Формат прототипа:

         маркировать аргументы имени макроса (возможны от 0 до 200)
Столбец: 1 10 16 (обычно)
 

Метка в прототипе необязательна. Его можно использовать для размещения этикетки в начале одной из строк тела цикла.

Тело макроса содержит инструкции макроса, которые должны быть выполнены и инструкции по сборке, которые нужно скопировать в код.

MEND сигнализирует об окончании определения макроса.

Например:

         МАКРО
         EXMPL1
         ЛА 1, ПАРМЛИСТ
         L 15,=V(СТРОЙКА)
         БАЛР 14,15
         ИСПРАВИТЬ


Чтобы вызвать макрос EXMPL1:

         EXMPL1


В сборке вы увидите:

+ ЛА 1, ПАРМЛИСТ
+ L 15,=V(СТРОЙКА)
+ БАЛР 14,15
 

Знак + в столбце 1 указывает, что строки кода были в макросе.

Переменные символы

Переменные символы — это символы, которым могут быть присвоены значения либо программист, либо ассемблер. Есть три типа:

  1. Символические параметры
  2. Системные переменные
  3. SET Переменные

Имена переменных символов:

  1. Длина от двух до восьми символов
  2. Первый символ ВСЕГДА амперсанд (&)
  3. Второй символ ВСЕГДА буква
  4. Остальные символы могут быть либо буквами, либо цифрами

Символические параметры используются в определении макроса и присвоенное значение программистом. При вызове макроса эти параметры заменяются значениями, которые им присвоены. Есть два типа символьные параметры:

  1. Позиционные параметры
  2. Параметры ключевого слова

Позиционные параметры являются символическими параметрами, которые должны указывается в определенном порядке каждый раз при вызове макроса. Параметр будет заменено в теле макроса на значение, указанное при макрос называется.

         МАКРО
&LABEL EXMPL1 &SUBRTN,&PARMS
&ЭТИКЕТКА LA 1,&PARMS
         L 15,=V(&SUBRTN)
         БАЛР 14,15
         ИСПРАВИТЬ

Новый вызов макроса EXMPL1:

CALL1 EXMPL1 СТРОИТЬ,PARM1

В сборке:

+CALL1 LA 1,PARM1
+ L 15,=V(СТРОЙКА)
+ БАЛР 14,15
 

Параметры ключевого слова являются символическими параметрами, которые могут быть указывается в любом порядке при вызове макроса. Параметр будет заменяется в теле макроса на значение, указанное при вызове макроса. называется. Этим параметрам можно присвоить значение по умолчанию. Если нет по умолчанию указано значение, и если параметру не присвоено значение, когда макрос вызывается, то параметр будет заменен нулевой строкой.

Каждый параметр ключевого слова будет иметь знак равенства (=), как последний символ имени параметра.

         МАКРО
&LABEL EXMPL1 &SUBRTN=СБОРКА,&PARMS=
&ЭТИКЕТКА LA 1,&PARMS
         L 15,=V(&SUBRTN)
         БАЛР 14,15
         ИСПРАВИТЬ

Новый вызов макроса EXMPL1:

         EXMPL1 PARMS=PARM2,SUBRTN=ПЕЧАТЬ

В сборке:

+ ЛА 1,ПАРМ2
+ L 15,=V(ПЕЧАТЬ)
+ БАЛР 14,15


         EXMPL1 ПАРАМЕТРЫ = ПАРАМЕТРЫ3

В сборке:

+ ЛА 1,ПАРМ3
+ L 15,=V(СТРОЙКА)
+ БАЛР 14,15



         EXMPL1

В сборке:

+ ЛА 1,
+ L 15,=V(СТРОЙКА)
+ БАЛР 14,15
 

Если используется комбинация параметров позиции и ключевого слова, все позиционные параметры должны быть закодированы ДО параметров ключевого слова.

Прототип: &LABEL EXMPL2 &D,&E,&A=,&B=,&C=20

Вызов 1: CALL1 EXMPL2 VAL3,VAL4,B=VAL1,A=(R5,R7),C=

   D получит VAL3, E получит VAL4, A получит (R5,R7),
   B получит VAL1, а C получит нулевую строку.
   

Вызов 2: ВЫЗОВ2 EXMPL2 VAL3,C=10,A=25

   D получит VAL3, E получит нулевую строку, A получит 25,
   B получит нулевую строку, а C получит 10
 

Системные переменные — это переменные, которым ассемблер присваивает значения. Они определяются системой.

Наиболее распространенные системные переменные: &SYSNDX, &SYSLIST, &SYSDATE, &SYSTIME, &SYSPARM, &SYSECT

&SYSNDX

  • Генерирует уникальный 4-значный номер при каждом вызове макроса

  • Значение обычно объединяется с символом из 4 символов

  • Первое значение 0001, при каждом последующем вызове значение будет увеличивается на единицу

 МАКРО
&ЭТИКЕТКА ДОБАВИТЬ &NUM1,&NUM2
&ЭТИКЕТКА ST 5,СОХРАНИТЬ
         L 5,&NUM1
         5,&NUM2
         ST 5,&NUM1
         Б СЛЕДУЮЩИЙ
СОХРАНИТЬ DC F'-1'
СЛЕДУЮЩИЙ L 5,СОХРАНИТЬ
         ИСПРАВИТЬ


В программе:

         ДОБАВИТЬ ФЛД1, ФЛД2
+ СЛ 5, СОХРАНИТЬ
+ Л 5, ФЛД1
+ А 5, ФЛД2
+ СТ 5, ФЛД1
+ Б СЛЕДУЮЩИЙ
+СОХРАНИТЬ DC F'-1'
+ДАЛЕЕ L 5,СОХРАНИТЬ
         . ..
         ...
         ДОБАВИТЬ ФЛД3, ФЛД4
+ СЛ 5, СОХРАНИТЬ
+ Л 5, ФЛД3
+ А 5,FLD4
+ СТ 5, ФЛД3
+ Б СЛЕДУЮЩИЙ
+СОХРАНИТЬ DC F'-1'
+ДАЛЕЕ L 5,СОХРАНИТЬ
 

Метки SAVE и NEXT дублируются, когда макрос вызывается для второй раз, ассемблер нет-нет. &SYSNDX может быть использован для решения этой проблемы.

Мы собираемся объединить значение &SYSNDX в конец каждого из этикетки.

 МАКРО
&ЭТИКЕТКА ДОБАВИТЬ &NUM1,&NUM2
&ЭТИКЕТКА ST 5,СОХРАНИТЬ&SYSNDX
         L 5,&NUM1
         5,&NUM2
         ST 5,&NUM1
         B СЛЕДУЮЩАЯ И СИСТЕМА
SAVE&SYSNDX DC F'-1'
NEXT&SYSNDX L 5,СОХРАНИТЬ&SYSNDX
         ИСПРАВИТЬ


В программе:

         ДОБАВИТЬ ФЛД1, ФЛД2
+ СТ 5,СОХРАНИТЬ0001
+ Л 5, ФЛД1
+ А 5, ФЛД2
+ СТ 5, ФЛД1
+ В СЛЕДУЮЩИЙ0001
+SAVE0001 DC F'-1'
+NEXT0001 L 5,СОХРАНИТЬ0001
         ...
         ...
         ДОБАВИТЬ ФЛД3, ФЛД4
+ СТ 5,СОХРАНИТЬ0002
+ Л 5, ФЛД3
+ А 5,FLD4
+ СТ 5, ФЛД3
+ В СЛЕД0002
+SAVE0002 DC F'-1'
+NEXT0002 L 5,СОХРАНИТЬ0002
 

&СИСТЕМНЫЙ СПИСОК

Формат 1: &SYSLIST(n) -- относится к позиционному параметру n  th 

Формат 2: &SYSLIST(n,k) -- относится к позиционному параметру n  th 
                            k  th  член


ВЫЗОВ3 ПРИМЕР3 ОДИН,ДВА,(R5,R6,R7,R8),ПЯТЬ,(R1)

(R5,R6,R7,R8) — подсписок позиционных параметров с 4 элементами. 

(R1) — подсписок позиционных параметров с 1 элементом


&SYSLIST(2) --> ДВА
&СИСТЕМНЫЙ СПИСОК(3,3) --> R7
&SYSLIST(4) --> нулевое значение
&SYSLIST(6,1) --> R1
 

Параметры ключевых слов также могут иметь подсписки, но &SYSLIST НЕ МОЖЕТ использоваться для ссылаться на значения. Будет использоваться имя параметра ключевого слова.

         МАКРО
         ПОДСПИСКИ &P1,&KEY=(0,1,3)
&P1(1) DC F'&KEY(1)'
&SYSLIST(1,2) ЭКВ &P1(2)
         ИСПРАВИТЬ


&КЛЮЧ --> (0,1,3)
&Ключ(1) --> 0
&КЛЮЧ(2) --> 1
&KEY(3) --> 3
&KEY(4) --> НОЛЬ

В программе:

CALL4 ПОДСПИСКИ (ЗДЕСЬ,ТАМ),KEY=(5,6,7)
+ЗДЕСЬ DC F'5'
+ТАМ ЭКВ ТАМ
 

&SYSDATE используется для получения даты сборки исходного кода. Это в формате ММ/ДД/ГГ

&SYSTIME используется для получения времени сборки исходного кода. Это в формате чч.мм

&SYSECT используется для получения имени CSECT, в котором был вызван макрос.

&SYSPARM используется для передачи строки символов из JCL.

Переменные SET — это параметры, которым присваивается начальное значение и которые могут изменяться во время вызова макроса. Есть три типа:

  1. Арифметика
  2. Двоичный
  3. Символ

Каждая переменная SET может быть либо локальной , либо глобальной .

Локальной переменной SET присваивается начальное значение каждый раз, когда макрос называется. Он известен только макросу, в котором он создан.

Глобальная переменная SET инициализируется при первом вызове макроса и сохраняет значение от одного вызова к другому. На них можно ссылаться в других макросы также, но они должны быть объявлены внутри каждого макроса.

Все переменные SET должны быть объявлены непосредственно после оператора прототипа. Все глобальные переменные должны быть объявлены перед локальными переменными.

Арифметические переменные SET — это переменные, значение которых можно изменить с помощью арифметическое выражение.

  Чтобы объявить ЛОКАЛЬНУЮ переменную:  LCLA &var_name1,&var_name2...

   - Они инициализируются 0 каждый раз, когда вызывается макрос



  Чтобы объявить ГЛОБАЛЬНУЮ переменную:  GBLA &var_name1,&var_name2...

   - Они инициализируются 0 при первом вызове макроса.



  Чтобы изменить значение:  &var_name SETA arithmetic_expression



         LCLA &CNTR объявляет арифметическую переменную с именем &CNTR.
&CNTR SETA 1 изменяет значение счетчика на 1
&CNTR SETA &CNTR+1 увеличивает значение счетчика на 1
&CNTR SETA &CNTR*5 умножить счетчик на 5
 

Двоичные переменные SET — это переменные, значение которых может быть либо 0, либо 1. Обычно они используются в качестве переменных-флагов, где 0 означает ЛОЖЬ, а 1 – ИСТИННЫЙ.

  Чтобы объявить ЛОКАЛЬНУЮ переменную:  LCLB &var_name1,&var_name2...

   - Они инициализируются 0 каждый раз, когда вызывается макрос



  Чтобы объявить ГЛОБАЛЬНУЮ переменную:  GBLB &var_name1,&var_name2. ..

   - Они инициализируются 0 при первом вызове макроса.



  Чтобы изменить значение:  &var_name SETB (условие)

   - (условие) разрешается либо в 0 (ложь), либо в 1 (истина)
     из-за этого 0 или 1 могут быть жестко закодированы вместо
     (состояние)


         LCLB И ФЛАГ
&FLAG SETB ('&PARMS' EQ '')
 

Переменные SET символов — это переменные, значение которых может быть текстовой строкой. до 255 символов.

  Чтобы объявить ЛОКАЛЬНУЮ переменную:  LCLC &имя_переменной1,&имя_переменной2...

   - Они инициализируются нулевой строкой каждый раз, когда макрос
     называется



  Чтобы объявить ГЛОБАЛЬНУЮ переменную:  GBLC &var_name1,&var_name2...

   - Они инициализируются нулевой строкой в ​​первый раз
     макрос называется



  Чтобы изменить значение:  &var_name Строка SETC

   - строка может быть:
      1. Текстовая строка, заключенная в одинарные кавычки «привет»
      2. Текстовая строка и символ набора символов «ABC&MSG» или «&MSG. ABC».
      3. Комбинация двух символов набора символов '&MSG1&MSG2'
      4. Подстрока символа набора символов '&MSG'(начало,длина)
           - начало - первый символ подстроки
           - длина - это длина подстроки
      


         LCLC и MSG
&MSG SETC 'Привет'
&MSG SETC '&MSG. world» изменяет &MSG на «Hello world»

ПРИМЕЧАНИЕ. Точка необходима для обозначения конца установленного имени символа.



         LCLC и NDX
&NDX SETC '&SYSNDX' теперь можно использовать &NDX вместо &SYSNDX



         LCLC &ТЕКСТ1,&ТЕКСТ2
&ТЕКСТ1 НАСТРОЙКА 'BOBCAT'
&TEXT2 SETC '&TEXT1'(1,3) &TEXT2 установлен на 'BOB'
 

Существует два типа комментариев, которые можно включить в определение макроса.

Комментарий, начинающийся с * в столбце 1, будет воспроизведен в сборке.

Комментарий, начинающийся с .*, НЕ будет воспроизводиться в сборке.

 МАКРО
&LABEL EXMPL1 &SUBRTN=СБОРКА,&PARMS=
.****************************************************** **********
. *
.* Определение макроса для вызова внешней подпрограммы
.*
.********************************************************* **********
*
* Следующие строки вызовут внешнюю подпрограмму
*
&ЭТИКЕТКА LA 1,&PARMS
         L 15,=V(&SUBRTN)
         БАЛР 14,15
         ИСПРАВИТЬ


Новый вызов макроса EXMPL1:

         EXMPL1 SUBRTN=ПЕЧАТЬ,PARMS=PARM2


В сборке:

+*
++ Следующие строки вызовут внешнюю подпрограмму
+*
+ ЛА 1,ПАРМ4
+ L 15,=V(ПЕЧАТЬ)
+ БАЛР 14,15

 

Еще пара макрокоманд:

МЕКСИТ

Эта инструкция завершает обработку определения макроса.

Любые инструкции/заявления, которые следуют за MEXIT, НЕ будут частью лист сборки.

MEXIT обычно используется, когда проверка ошибок выполняется в теле макроса.

 МАКРО
&LABEL EXMPL1 &SUBRTN=СБОРКА,&PARMS=
&ЭТИКЕТКА LA 1,&PARMS
         L 15,=V(&SUBRTN)
         МЕКСИТ
         БАЛР 14,15
         ИСПРАВИТЬ


Вызов макроса EXMPL1:

         EXMPL1 SUBRTN=ПЕЧАТЬ,PARMS=PARM2


В сборке:

+ ЛА 1,ПАРМ4
+ L 15,=V(ПЕЧАТЬ)
 

ПРИМ.

Эта инструкция используется для создания сообщения об ошибке в листинге сборки.

 Формат 1: MNOTE 'здесь идет сообщение об ошибке' 

При выполнении MNOTE будет отображаться сообщение об ошибке.

 Формат 2: серьезность MNOTE, «здесь идет сообщение об ошибке» 

Этот формат MNOTE присваивает ошибке код серьезности. Код серьезности может быть от 0 до 255 и по умолчанию равно 1, если не указано. Код используется, чтобы указать, является ли сообщение ошибкой или просто предупреждением.

При выполнении этой версии MNOTE будет отображаться сообщение об ошибке вместе с кодом серьезности.

Условная сборка

Последовательность, в которой обрабатываются инструкции/операторы, может быть изменена с помощью инструкции по условной сборке.

Символ последовательности — это любой символ, удовлетворяющий следующим правилам:

  • Длина от двух до восьми символов
  • Первый символ — точка
  • Второй символ — буква
  • Остальные символы могут быть либо буквами, либо цифрами

Символы последовательности эквивалентны метке в программе на ассемблере.

АНОП

Эта инструкция предоставляет метку для перехода к другим инструкциям. Это эквивалентно DS 0H в программе на ассемблере.

 Формат: .sequence_symbol ANOP 

AGO

Эта инструкция выполняет безусловный переход.

 Формат: .sequence_symbol_1 AGO .sequence_symbol_2 

Выполняется безусловный переход к .sequence_symbol_2. .sequence_symbol_1 является необязательным. Если указан .sequence_symbol_1, он предоставляет метку для другая условная инструкция сборки для перехода к ней.

АИФ

Эта инструкция выполняет условный переход.

 Формат: .seq_sym_1 AIF (условное выражение).seq_sym_2 

Переход к .seq_sym_2 выполняется, если результат условного выражения равно 1 (эквивалентно TRUE).

Если условное выражение оценивается как 0 (эквивалентно FALSE), выполняется строка сразу после AIF.

Условное выражение AIF

 Формат: (операнд_1 операнд_реляционного_оператора_2) 

операнд_1 и операнд_2 могут быть:

  • арифметическое выражение
  • 0 или 1
  • строка символов, заключенная в одинарные кавычки
  • переменный символ

реляционный_оператор может быть:

  • Эквалайзер для равенства
  • NE для не равного
  • LT менее чем за
  • LE меньше или равно
  • GT больше
  • GE больше или равно
 Например:

       AIF('&PARMS' EQ ''). NOPARM
 

Если &PARMS равно пустой строке, перейти к .NOPARM

 МАКРО
&LABEL EXMPL1 &SUBRTN=СБОРКА,&PARMS=
         AIF('&PARMS' EQ '').NOPARMS
&ЭТИКЕТКА LA 1,&PARMS
.NOPARMS АНОП
         L 15,=V(&SUBRTN)
         БАЛР 14,15
         ИСПРАВИТЬ


Вызов макроса EXMPL1:

         EXMPL1 SUBRTN=ПЕЧАТЬ


В сборке:

+ L 15,=V(ПЕЧАТЬ)
+ БАЛР 14,15



         МАКРО
         ЭКВРЕГС
         LCLA &ЧИСЛО
.LOOP AIF (&NUM GT 15).LPEND
R&ЧИСЛО EQU &ЧИСЛО
&NUM SETA &NUM+1
         НАЗАД .LOOP
.LPEND ANOP
         ИСПРАВИТЬ


Вызов макроса EQUREGS:

         ЭКВРЕГС


В сборке:

+R0 ЭКВ 0
+R1 ЭКВ 1
...
...
+R15 ЭКВ 15




         МАКРО
         ВЫХОДНАЯ ССЫЛКА И ТИП
         AIF ('&TYPE' NE '').FOUND
         MNOTE '*** ОТСУТСТВУЕТ ПАРАМЕТР ТИПА ***'
         МЕКСИТ
.НАШЕЛ АНОП
         AIF ('&TYPE' EQ 'N').НОРМАЛЬНЫЙ
         AIF ('&TYPE' EQ 'R').RETURN
         AIF ('&TYPE' EQ 'V').ЗНАЧЕНИЕ
         AIF ('&TYPE' EQ 'B'). ОБА
         MПРИМЕЧАНИЕ 8, «*** ТИП НЕДЕЙСТВИТЕЛЬНЫЙ»
         МЕКСИТ
.НОРМАЛЬНЫЙ АНОП

  

Атрибуты данных

Для каждой константы или инструкции ассемблер присваивает атрибутов данных . Эти атрибуты могут использоваться с инструкциями условной сборки для управления последовательность и содержание генерируемых операторов.

Атрибут длины

Этот атрибут представляет собой числовое значение, равное количеству байтов. занимают данные, представленные символическим параметром.

Значение символического параметра ДОЛЖНО быть меткой в ​​вызывающей программе.

Формат: L'символический_параметр

         МАКРО
         ПЕРЕМЕЩЕНИЕ И НАЗНАЧЕНИЕ И ИСТОЧНИК
         MVC &DEST.(L'&SOURCE),&SOURCE
         ИСПРАВИТЬ
         
В программе:

         MOVEIT PLINE, СТОЛ
+ MVC PLINE(80),ТАБЛИЦА


         ПЕРЕМЕЩЕНИЕ, 80
+ ПЛИНИЯ МВК (0), 80

Атрибут длины равен 0, потому что 80 не является меткой в ​​вызывающем
программа. 


         MOVEIT PLINE, ТАБЛИЦА 2
+ MVC PLINE(20), ТАБЛИЦА 2

Атрибут длины равен 20. 4 — это коэффициент повторения, поэтому НЕ
входит в длину.


ПЛАЙН DS CL132
ТАБЛИЦА DS CL80
ТАБЛИЦА 2 DS 4CL20
 

Атрибут счета

Этот атрибут представляет собой числовое значение, равное количеству символов в фактическом передаваемом параметре.

Если значение равно 0, параметр отсутствует.

Формат: K'символический_параметр

         МАКРО
         ПЕЧАТЬ &P1,&P2
         LCLA &CNT1,&CNT2
         AIF (K'&P1 NE 0).FOUND
         MNOTE '*** ОТСУТСТВУЕТ ПАРАМЕТР ***'
         МЕКСИТ
.НАШЕЛ АНОП
&CNT1 SETA K'&P1
&CNT2 SETA K'&P2-2
         XPRNT =C&P2,&CNT2
         ЛА 5 и CNT1
         ИСПРАВИТЬ


В программе:

         PRINTIT JUNKY, '1 НАЧАЛО СТРАНИЦЫ'
+ XPRNT =C'1 НАЧАЛО СТРАНИЦЫ',14
+ ЛА 5,5

K'&P1 --> K'JUNKY --> 5, так как в JUNKY 5 букв.

K'&P2-2 --> K''1 НАВЕРХ СТРАНИЦЫ'-2 --> 16-2 --> 14
  2 вычитается для учета одинарных кавычек


         НАПЕЧАТАЙТЕ ВСЁ, '0 ДВОЙНОЕ ПРОСТРАНСТВО'
+ XPRNT =C'0 ДВОЙНОЙ ПРОБЕЛ',15
+ ЛА 5,8
 

Атрибут номера

Этот атрибут представляет собой числовое значение, равное количеству операндов. в подсписке операндов.

Если этот атрибут используется в &SYSLIST, будет указано количество позиционных параметры в операторе прототипа.

Если этот атрибут используется в &SYSLIST(m), будет указано количество элементов в подсписок параметра m th .

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

 Формат: N'символический_параметр


Следующий макрос создаст таблицу ответвлений, аналогичную
к тому, который используется в назначении хеширования. &BTAB — это подсписок
разные метки для ветвления. Первый член для кода возврата
0, второй код возврата 4 и т. д. Если &BTAB не указан
при вызове макроса не генерировать таблицу. Если &BTAB
указано, вы можете предположить, что есть по крайней мере один член в
подсписок. Сгенерированная таблица должна иметь уникальную метку
(BTAB????) в случае, если макрос вызывается более одного раза. После всего
нужных веток создано, а SOC1???? ДС Н'0'
должен быть закодирован так, чтобы программа аварийно завершилась, если неправильный код возврата
возвращается в регистре 15. 


         МАКРО
         ФИЛИАЛ И BTAB
         LCLC и NDX
         LCLA &NUM,&CNT
&NDX SETC '&SYSNDX'
&CNT SETA 2
&NUM SETA N'&BTAB
         AIF ('&BTAB' ЭКВАЛАЙЗЕР'').NOTAB
         B BTAB&NDX.(15)
BTAB и NDX B и BTAB (1)
.BLOOP AIF (&CNT GT &NUM).ГОТОВО
         B &BTAB(&CNT)
&CNT SETA &CNT+1
         НАЗАД .BLOOP
.ГОТОВО
SOC1&NDX DC H'0'
.НОТАБ АНОП
         ИСПРАВИТЬ


В программе:

         РАЗВЕТВЛЕНИЕ (RC0,RC4,RC8)
+ В BTAB0001(15)
+BTAB0001 Б RC0
+ Б РК4
+ Б РК8
+SOC10001 DC H'0'
 

Атрибут типа

Этот атрибут указывает тип данных поля, присвоенного символический параметр при вызове макроса.

 Формат: T'symbolic_parameter  Символы оператора DC/DS Значение
 Константа адреса
 B Двоичная константа
 C Характерная константа
 F Полное слово
 H Полуслово
 P Упакованный десятичный
 R A-кон или V-кон
 X Шестнадцатеричный
 Z Зонированный десятичный
 V V-con  Символы для других утверждений Значение
 я машинная инструкция
 J Имя CSECT
 M Макрос Инструкция
 O Пропущенный операнд 
 МАКРО
 ТЕКСМПЛ &P1,&P2
 LCLC &Ch2,&Ch3
 AIF (T'&P1 NE 'O').
Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *