





  Утвержден


  2б.00152-01 35 01-ЛУ







                  Операционная система МОС ВП





       СИСТЕМА ПРОГРАММИРОВАНИЯ НА ЯЗЫКЕ МАКРОАССЕМбЛЕР



                        Описание языка







                    2б.00152-01 35 01

                       Листов 302/4К


















                             1987

 Перв.примен.

  2б.00152-01                                        Литера












           


                        







                  Операционная система МОС ВП





       СИСТЕМА ПРОГРАММИРОВАНИЯ НА ЯЗЫКЕ МАКРОАССЕМБЛЕР



                        Описание языка







                      00152-01 35 01

                        Листов 298   









                             1987




                            - 2 -

                        00152-01 35 01



  			  АННОТАЦИЯ



       Данный документ предназначен для программистов, разра-

  батывающих программы на языке макроассемблер.

       В документе дано описание  языка  макроассемблер.  Для

  каждого элемента языка приведены формат и  описание  выпол-

  няемой функции. Документ состоит из шести разделов  и  трех

  приложений.

       В разделе 1 приведены общие сведения о языке  макроас-

  семблер СМ 1700.

       В разделе 2 описан формат исходных предложений.

       В разделе 3 описаны элементы языка: набор знаков, чис-

  ла, символы, локальные метки, термы и выражения, унарные  и

  бинарные операции, операторы прямого присваивания, а  также

  текущий счетчик адресов программы.

       В разделе 4 содержится информация о режимах адресации.

       В разделе 5 описаны общие директивы макроассемблера.

       В разделе 6 содержится информация  о  макрокомандах  и

  директивах макрокоманд.

       В приложении 1 описаны коды инструкций.

       В приложении 2 приводятся краткие  сведения  по  языку

  макроассемблер.

       Правила преобразования  чисел  из  десятичной  системы

  счисления в шестнадцатеричную и наоборот описаны в приложе-

  нии 3.





                            - 3 -

                        00152-01 35 01






                          СОДЕРЖАНИЕ





  1.  ОБЩИЕ СВЕДЕНИЯ                                        7


  2.  ФОРМАТ ИСХОДНОГО ПРЕДЛОЖЕНИЯ ЯЗЫКА MAКРОАССЕМБЛЕР    10


  2.1.    Поле метки                                       13

  2.2.    Поле операции                                    14

  2.3.    Поле операнда                                    15

  2.4.    Поле комментария                                 16


  3.  ЭЛЕМЕНТЫ ЯЗЫКА МАКРОАССЕМБЛЕР                        18


  3.1.    Набор графических символов                       18

  3.2.    Числа                                            22

  3.2.1.    Целые числа                                    22

  3.2.2.    Числа с плавающей запятой                      23

  3.2.3.    Десятичные числа в упакованном формате         25

  3.3.    Символы                                          26

  3.3.1.    Постоянные символы                             26

  3.3.2.    Символы, определяемые пользователем,  и

            имена макрокоманд                              27

  3.3.3.    Определение значений символов                  29

  3.4.    Локальные метки                                  31

  3.5.    Термы и выражения                                35

  3.6.    Унарные операции                                 38




                            - 4 -

                        00152-01 35 01


  3.6.1.    Операции управления основанием  системы

            счисления                                      41

  3.6.2.    Текстовые операции                             43

  3.6.2.1.  Операция ^A                                    43

  3.6.2.2.  Операция регистровой маски ^M                  44

  3.6.3.    Операции числового представления               46

  3.6.3.1.  Операция формата с плавающей запятой           47

  3.6.3.2.  Операция дополнения                            47

  3.7.    Бинарные операции                                48

  3.7.1.    Операция арифметического сдвига                50

  3.7.2.    Операция логическое "И"                        51

  3.7.3.    Операция логическое "ИЛИ"                      51

  3.7.4.    Операция логическое исключающее "ИЛИ"          51

  3.8.    Операторы прямого присваивания                   52

  3.9.    Счетчик адресов программы                        53


  4.  РЕЖИМЫ АДРЕСАЦИИ                                     56


  4.1.    Режимы   адресации   регистров   общего

          назначения                                       56

  4.1.1.    Регистровый режим                              57

  4.1.2.    Косвенно-регистровый режим                     58

  4.1.3.    Режим адресации с автоувеличением              59

  4.1.4.    Режим     косвенной     адресации     с

            автоувеличением                                60

  4.1.5.    Режим адресации с автоуменьшением              61

  4.1.6.    Режим адресации по смещению                    62

  4.1.7.    Режим косвенной адресации по смещению          65




                            - 5 -

                        00152-01 35 01


  4.1.8.    Режим литеральной адресации                    67

  4.2.    Режимы    адресации    через    счетчик

          инструкций                                       69

  4.2.1.    Режим относительной адресации                  70

  4.2.2.    Режим косвенной относительной адресации        72

  4.2.3.    Режим абсолютной адресации                     74

  4.2.4.    Режим непосредственной адресации               74

  4.2.5.    Режим адресации общего вида                    77

  4.3.    Режим индексации                                 78

  4.4.    Адресация в инструкциях  относительного

          перехода                                         83


  5.  ОБЩИЕ ДИРЕКТИВЫ ЯЗЫКА МАКРОАССЕМБЛЕР                 85


  5.1.    Директивы управления листингом                   88

  5.2.    Директивы вывода сообщений                       97

  5.3.    Директивы дополнительных возможностей           102

  5.4.    Директивы хранения данных                       108

  5.5.    Директивы управления счетчиком адресов          130

  5.6.    Директивы секционирования программ              137

  5.7.    Директивы управления символами                  151

  5.8.    Директивы  определения  входной   точки

          программы                                       155

  5.9.    Директивы и поддирективы трансляции             161

  5.10.   Директивы перекрестных ссылок                   174

  5.11.   Директивы генерирования инструкций              177

  5.12.   Директива дополнительной компоновки             183


  6.  МАКРОКОМАНДЫ                                        188



                            - 6 -

                        00152-01 35 01


  6.1.    Аргументы макрокоманд                           190

  6.1.1.    Значения по умолчанию                         192

  6.1.2.    Ключевые аргументы                            193

  6.1.3.    Аргументы в виде строки символов              194

  6.1.4.    Конкатенация аргументов                       200

  6.1.5.    Символьное    представление    числовых

            аргументов                                    201

  6.1.6.    Автоматически   создаваемые   локальные

            метки                                         203

  6.1.7.    Строковые операции макрокоманд                205

  6.1.7.1.  Операция %LENGTH                              206

  6.1.7.2.  Операция %LOCATE                              207
                                                           
  6.1.7.3.  Операция %EXTRACT                             209

  6.2.    Директивы макрокоманд                           211


  Приложение 1.

      Таблица кодов инструкций                            235


  Приложение 2.

      Краткие сведения по языку макроассемблер            263


  Приложение 3.

      Шестнадцатерично-десятичное преобразование чисел    294


      Перечень ссылочных документов                       298











                           - 6К -

                     2б.00152-01 35 01


  6.1.    Аргументы макрокоманд                           190

  6.1.1.    Значения по умолчанию                         192

  6.1.2.    Ключевые аргументы                            193

  6.1.3.    Аргументы в виде строки символов              194

  6.1.4.    Конкатенация аргументов                       200

  6.1.5.    Символьное    представление    числовых

            аргументов                                    201

  6.1.6.    Автоматически   создаваемые   локальные

            метки                                         203

  6.1.7.    Строковые операции макрокоманд                205

  6.1.7.1.  Операция %LENGTH                              206

  6.1.7.2.  Операция %LOCATE                              207

  6.1.7.3.  Операция %EXTRACT                             209

  6.2.    Директивы макрокоманд                           211


  Приложение 1.

      Таблица кодов инструкций                            235


  Приложение 2.

      Краткие сведения по языку макроассемблер            263


  Приложение 3.

      Шестнадцатерично-десятичное преобразование чисел    294
                                                           

      Перечень ссылочных документов                       298К





                            - 7 -

                        00152-01 35 01


                      1. ОБЩИЕ СВЕДЕНИЯ



       Язык макроассемблер предназначен для разработки  прог-

  рамм в операционной системе МОС ВП на ЭВМ СМ 1700.

       Исходные программы, составленные на языке программиро-

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

  выполняется программой  макроассемблер,  символическое  имя

  которой MACRO. Программа МACRO создает об'ектный модуль  и,

  если указано,  файл  листинга.  Функции,  выполняемые  этой

  программой, описаны  в  [1].  В  этом  разделе  описываются

  средства языка макроассемблер. Исходные программы,  состав-

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

  ности исходных предложений (символьных строк). Эти исходные

  предложения могут быть следующие:

       - основные инструкции ЭВМ СМ 1700;

       - операторы прямого присваивания;

       - директивы макроассемблера.

       С помощью инструкций  производится  обработка  данных.

  Они обеспечивают такие функции, как суммирование,  преобра-

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

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

  качестве которых могут выступать данные любого типа,  необ-

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

  ций ЭВМ СМ 1700 приведена в приложении 1, а в [2]. Она под-

  робно описана.

       С помощью  операторов  прямого  присваивания  символам

  присваиваются значения.




                            - 8 -

                        00152-01 35 01


       Директивы языка макроассемблер осуществляют управление

  процессом трансляции и обеспечивают средства для  использо-

  вания инструкций. Разделы 5 и 6 содержат подробное описание

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

  сведения по директивам. Существует два класса директив язы-

  ка макроассемблер: общие директивы и директивы макрокоманд.

       Общие директивы позволяют выполнять  следующие  дейст-

  вия:

       - хранить данные или резервировать память для хранения

         данных;

       - управлять размещением частей программы в памяти;

       - определять способы доступа к секциям памяти, в кото-

         рых будет храниться программа;

       - определять точку входа в программу или в часть прог-

         раммы;

       - определять способ, посредством которого будет произ-

         водиться ссылка к символам;

       - определять, какая часть программы должна  транслиро-

         ваться лишь при определенных условиях;

       - управлять форматом и содержанием файла листинга;

       - посылать информационные сообщения;

       - управлять  дополнительными  возможностями,   которые

         применяются для интерпретации исходной программы;

       - определять новые коды инструкций.

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

  макрокоманд и блоков повторений. Они позволяют программисту

  выполнять следующие действия:




                            - 9 -

                        00152-01 35 01


       - повторять одинаковые или похожие  последовательности

         исходных предложений, встречающиеся в программе;

       - использовать строчные операции для обработки и  про-

         верки содержания исходных предложений.

       Использование макрокоманд и блоков повторений помогает

  минимизировать количество ошибок, возникающих по вине прог-

  раммиста и ускорить процесс отладки программы.












































                           - 10 -

                        00152-01 35 01


     2. ФОРМАТ ИСХОДНОГО ПРЕДЛОЖЕНИЯ ЯЗЫКА MAКРОАССЕМБЛЕР



       Исходная  программа  состоит   из   последовательности

  исходных предложений, каждое из которых,  одно  за  другим,

  программа  макроассемблер  интерпретирует  и  обрабатывает,

  формируя при этом об'ектный код  или  выполняя  специальные

  действия этапа трансляции. Исходное предложение может зани-

  мать одну исходную строку, либо  может  быть  расширено  на

  несколько исходных строк. Каждая из  исходных  строк  может

  содержать до 132 символов, однако не следует превышать раз-

  мер строки за 80 символов, чтобы  гарантировать  размещение

  одной исходной строки (вместе с ее двоичным расширением) на

  одной строке в файле листинга.

       Предложение языка макроассемблер может включать в себя

  до четырех полей:
                                              
       1) поле метки,  содержащее  символическое  определение

  адреса в программе;

       2) поле операции,  содержащее  спецификацию  действия,

  которое должно быть выполнено  при  данном  предложении;  в

  этом  поле  может  располагаться  обозначение   инструкции,

  директивы или макровызова;

       3) поле операнда, содержащее операнд (операнды)  инст-

  рукции либо аргумент (аргументы) директивы,  либо  аргумент

  (аргументы) макрокоманды;

       4) поле комментария, содержащее комментарий,  поясняю-

  щий смысл данного предложения; это поле не оказывает  влия-

  ния на выполнение программы.




                           - 11 -

                        00152-01 35 01


       Поле метки и поле комментария являются  необязательны-

  ми. Поле метки заканчивается двоеточием (:), а поле коммен-

  тария начинается с точки с запятой (;). Поле операнда долж-

  но соответствовать формату инструкции, директивы или макро-

  команды, которые определены в поле операции.

       Хотя поля предложения могут разделяться либо пробелом,

  либо знаком табуляции, для лучшей наглядности рекомендуется

  форматировать предложение знаком табуляции. Знаки табуляции

  используются как показано в табл. 1.

                                                    Таблица 1

  -----------------------------------------------------------

  Поле       !Начальная колонка !Количество символов табуля-

             !                  !ции для достижения колонки

  -----------------------------------------------------------

  Метки      !        1         !           0

  Операции   !        9         !           1

  Операнда   !        17        !           2

  Комментария!        41        !           5

       Пример 1.

         .TITLE  PROG1

         .ENTRY  BEGIN,^M<R1,R2>  ; Начало программы PROG1

          CLRL   R0

  M1:     INCL   R0

  M2:     ADDL3  (R3)+,R0,SYM     ; Получить значение SYM

          BLEQ   M1               ; Переход на M1, если

                                  ; Результат меньше или ра-

                                  ; вен 0




                           - 12 -

                        00152-01 35 01


          BRW    CONT             ; Безусловный переход на

                                  ; CONT

       Одно предложение может быть  продолжено  на  несколько

  строк. При этом в  качестве  последнего  значащего  символа

  перед полем комментария или в конце строки (если  коммента-

  рий отсутствует) следует употребить дефис (-).

       Пример 2.

  SAVE:  MOVAL  VECTOR_ADDRESS_2,- ; Сохранить адрес

                                   ; загрузки

                VECTOR_2(R1)

       Транслятор с языка макроассемблера обрабатывает приве-

  денное предложение как эквивалентное  следующему  предложе-

  нию:

  SAVE: MOVAL VECTOR_ADDRESS_2,VECTOR_2(R1) ; Сохранить ад-

                                            ; рес загрузки

       Предложение может быть продолжено с любой точки. Одна-

  ко символические имена, определяемые пользователем, и  пос-

  тоянные символы не могут быть продолжены на следующей стро-

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

  первым знаком на следующей строке  является  знак  горизон-

  тальной табуляции или  пробел,  то  это  символическое  имя

  будет ограничено этим знаком.

       Заметим, что если предложение появляется в  макроопре-

  делении, то это предложение не может содержать  более  1000

  знаков.

       Пустые строки, хотя и допустимы, не имеют  в  исходной

  программе какого-либо смысла, кроме как ограничителей пере-




                           - 13 -

                        00152-01 35 01


  несенной строки.

       В подразделах 2.1 - 2.4 каждое  из  полей  предложения

  описывается подробно.



       2.1. Поле метки


       Метка представляет  собой  определенный  пользователем

  символ, идентифицирующий адрес в программе.  Этому  символу

  присваивается значение, равное текущему  значению  счетчика

  адресов для данного адреса программной  секции,  в  которой

  эта метка появляется (за сведениями о  программных  секциях

  обращайтесь к [1]). Символическое имя, определяемое пользо-

  вателем, может включать в себя до 31 графического символа и

  содержать любой алфавитно-цифровой знак и знак  подчеркива-

  ния (_), а также знак денежной единицы  ($)  и  точку  (.).

  Более подробно о правилах формирования символических  имен,

  определяемых пользователем, описывается в подразделе 3.3.

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

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

       Метка ограничивается двоеточием (:) или двойным  двое-

  точием (::). Двоеточие означает, что данная метка определе-

  на только для текущего модуля (внутренний символ).  Двойное

  двоеточие означает, что  данная  метка  является  глобально

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

  ссылка из других об'ектных модулей.

       Метка, определенная в данной программе, не может  быть

  переопределена в этой же программе. Если  метка  определена

  более одного раза, то выдается сообщение об  ошибке,  когда



                           - 14 -

                        00152-01 35 01


  выполняется определение этой метки, и, когда метка  переоп-

  ределяется.

       Если метка распространяется за колонку 7,  предложение

  следует перенести на следующую строку, чтобы поле  операции

  могло начаться в колонке 9.

       Пример.

  М1:   MOVAL     TAB_ARG, R0 ; Получить в R0 адрес TAB_ARG

  COMPARE_ARG:

          CMPL    (R0), VALUE ; Сравнить значения аргумента

                              ; из таблицы TAB_ARG со значе-

                              ; нием VALUE

          BGTR    M3          ; Если больше - переход на м3

  М2::    MOVL    (R0), MIN   ; Получить в MIN значение ар-

                              ; гумента

          BRW     TEST1       ; Безусловный переход на TEST1

  М3::    MOVL    (R0), мAX   ; Получить в MAX значение ар-

                              ; гумента

          BRW     TEST2       ; Безусловный переход на TEST2

       В операторе  прямого  присваивания  поле  метки  также

  используется для символа.



       2.2. Поле операции


       В поле операции определяется  само  действие,  которое

  должно быть выполнено в данном  предложении.  В  этом  поле

  может содержать обозначение инструкции, директивы или  мак-

  ровызова.





                           - 15 -

                        00152-01 35 01


       Если операцией является инструкция, программа макроас-

  семблер генерирует в об'ектном модуле двоичный  код  данной

  инструкции. Коды инструкций приведены  в  приложении  1,  а

  система инструкций описана в [2]. Если  операцией  является

  директива, программа макроассемблер выполняет  определенные

  управляющие действия или выполняет операции во время транс-

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

  описаны в разделах 5 и 6. Если операцией является  макровы-

  зов, программа макроассемблер производит расширение  макро-

  команды.

       Поле операции может быть ограничено пробелом или  зна-

  ком горизонтальной табуляции, однако рекомендуемым  ограни-

  чителем является знак горизонтальной табуляции.



       2.3. Поле операнда


       Поле операнда может содержать операнды инструкций  или

  аргументы директив или макровызовов.

       Операнды инструкций идентифицируют адреса ячеек памяти

  или регистры, которые используются в машинной операции. Эти

  операнды определяют режим адресации для данной  инструкции.

  Поле операнда для специальной инструкции  должно  содержать

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

  рукции. Описание инструкций и  их  операндов  содержится  в

  документе [2].

       Аргументы директивы должны отвечать требованиям форма-

  та данной директивы. Аргументы макрокоманд должны  отвечать

  требованиям,  определенным  в  макроопределении.   Описание



                           - 16 -

                        00152-01 35 01


  директивы .MACRO (см. раздел 6).

       Если указываются два или более операндов, то  их  сле-

  дует  разделить  запятыми.  Язык  макроассемблер  допускает

  использование пробела и знака  горизонтальной  табуляции  в

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

  не появляются выражения. Однако  для  разделения  операндов

  инструкций и для директив, в которых в качестве  аргументов

  появляются выражения, требуется запятая.

       Поле операнда ограничивает точка с  запятой.  С  этого

  знака начинается поле комментария. Если в  строке  отсутст-

  вует комментарий, поле операнда ограничивается концом  этой

  строки.



       2.4. Поле комментария


       Поле комментария содержит  текст,  поясняющий  функцию

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

  комментарий. Комментарий не оказывает воздействия  на  про-

  цесс трансляции или на выполнение программы, за исключением

  случаев выдачи сообщений во  время  трансляции  директивами

  .ERROR, .PRINT, .WARN.

       Полю комментария должен предшествовать  знак  точка  с
                                                
  запятой (;), а ограничивается оно концом строки. Поле  ком-

  ментария может содержать любой печатный символ кода КОИ-8.

       Если комментарий не помещается на  одной  строке,  его

  можно перенести на  следующую  строку,  однако  переносимой

  части должен предшествовать еще один знак точка  с  запятой

  (;). На целой строке может располагаться лишь один  коммен-



                           - 17 -

                        00152-01 35 01


  тарий.

       Правильно  составленный  текст  комментария   передает

  смысл, а не действие данного предложения.  Например,  инст-

  рукция MOVAL BUF_PTR_I,R7 должна сопровождаться таким  ком-

  ментарием, как "установить указатель на первый буфер", а не

  таким, как "переслать адрес BUF_PTR_I в R7".

       Пример.

           MOVAB   DATA, R3   ; Получить в R3 адрес DATA

           CMPL    (R3), R0   ; Сравнить значения DATA с R0

           BEQL    LABEL      ; Если равны - пропустить

           CLRL    (R3)       ; Очистить DATA

  LABEL:   MOVL    (SP), R2   ; Скопировать верхний элемент

                              ; стека в R2
































                           - 18 -

                        00152-01 35 01


               3. ЭЛЕМЕНТЫ ЯЗЫКА МАКРОАССЕМБЛЕР



       Элементами  языка  макроассемблер  являются  составные

  части исходного предложения. В настоящем разделе описывают-

  ся составные части исходного предложения языка макроассемб-

  лер. К этим составным частям относятся следующие элементы:

       - набор графических символов;

       - символы;

       - локальные метки;

       - термы и выражения;

       - унарные и бинарные операции;

       - операторы прямого присваивания;

       - текущий счетчик адресов программы.



       3.1. Набор графических символов


       В исходных предложениях языка макроассемблер  употреб-

  ляются следующие графические символы:

       - латинские буквы;

       - буквы кириллицы;

       - цифры от 0 до 9;

       - знаки, перечисленные в табл. 2.















                           - 19 -

                        00152-01 35 01


                                                   Таблица 2

          Знаки, используемые в языке макроассемблер

  ----------------------------------------------------------

  Знак ! Наименование   ! Назначение знака

       !  знака         !

  ----------------------------------------------------------

    _  ! Знак подчерки- ! Знак в символических именах

       ! вания          !

    $  ! Знак денежной  ! Знак в символических именах

       ! единицы        !

    .  ! Точка          ! Знак в символических именах, счет-

       !                ! чик текущего адреса программы, де-

       !                ! сятичная точка

    :  ! Двоеточие      ! Ограничитель метки

    =  ! Знак равенства ! Оператор  прямого присваивания и

       !                ! ограничитель аргумента ключевого

       !                ! слова макрокоманды

       ! Знак горизон-  ! Ограничитель поля предложения
           
       ! тальной        !

       ! табуляции      !

       ! Пробел         ! Ограничитель поля предложения

    #  ! Знак номера    ! Индикатор режима непосредствнной

       !                ! адресации

    @  ! Коммерческое   ! Индикатор режима косвенной адреса-

       !   "эт"         ! ции и операция арифметического сд-

       !                ! вига

    ,  ! Запятая        ! Разделитель полей, операндов




                           - 20 -

                        00152-01 35 01


                                         Продолжение табл. 2

  ----------------------------------------------------------

  Знак ! Наименование   ! Назначение знака

       !  знака         !

  ----------------------------------------------------------

       !                !

    ;  ! Точка с запя-  ! Индикатор поля комментария

       ! той            !

    +  ! Плюс           ! Индикатор режима адресации с авто-

       !                ! увеличением, унарная операция

       !                ! "плюс" и операция арифметического

       !                ! суммирования

    -  ! Минус или де-  ! Индикатор  режима адресации с авто

       ! фис            ! уменьшением,  унарная операция "ми

       !                ! нус", операция  арифметического вы

       !                ! читания и индикатор переноса строк

    *  ! Звездочка      ! Операция  арифметического умножени

    /  ! Дробная черта  ! Операция арифметического деления

    &  !Коммерческое "и"! Операция логического "и"

    !  ! Восклицательный! Операция логического "или"

       ! знак           !

    \  ! Обратная дроб- ! Операция  исключающее  "или" и ин-

       ! ная черта      ! дикатор   числового   преобразова-

       !                ! ния в аргументах макрокоманд

    ^  ! Стрелка вверх  ! Ограничитель  унарных  операций и

       !                ! аргументов макрокоманд

    [ ]! Квадратные     ! Индикаторы  режима  адресации   с




                           - 21 -

                        00152-01 35 01


                                         Продолжение табл. 2

  ----------------------------------------------------------

  Знак ! Наименование   ! Назначение знака

       !  знака         !

  ----------------------------------------------------------

       ! скобки         ! Индексацией и коэффициента повто-

       !                ! рений

    ( )! Круглые скобки ! Индикаторы регистровой  косвенной

       !                ! адресации

    < >! Угловые скобки ! Ограничители аргументов  и выраже-

       !                ! ний

    ?  ! Знак вопроса   ! Индикатор автоматически  создавае-

       !                ! мых локальных меток в  аргументах

       !                ! тах макрокоманд

    '  ! Апостроф       ! Индикатор конкатенации  аргументов

       !                ! макрокоманд

    %  ! Знак процента  ! Строковые операции макрокоманд

       В табл. 3 определяются разделительные знаки, применяе-

  мые в предложениях языка макроассемблера.




















                           - 22 -

                        00152-01 35 01


                                                   Таблица 3

             Разделительные знаки, используемые в

               предложениях языка макроассемблер

  ----------------------------------------------------------

  Знак ! Наименование знака ! назначение   знака

  ----------------------------------------------------------

       ! Пробел или знак    ! Разделитель полей предложения.

       ! горизонтальной     ! Пробелы  в  составе  выражения

       ! табуляции          ! игнорируются

    ,  ! Запятая            ! Разделитель между  символичес-

       !                    ! кими аргументами в  поле  опе-

       !                    ! ранда. Множественные выражения

       !                    ! в поле  операнда  должны  быть

       !                    ! разделены запятыми



       3.2. Числа


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

  как целые, с плавающей запятой и десятичные  в  упакованном

  формате.



       3.2.1. Целые числа


       Целые числа могут  употребляться  в  любом  выражении,

  включая выражения в операндах и в операторах прямого  прис-

  ваивания.








                           - 23 -

                        00152-01 35 01


       Формат

       SNN,

  где S - необязательный знак, знак плюс (+) для поло-

          жительных чисел (умолчание) или знак минус

          (-) для отрицательных;

      NN - последовательность цифр, допустимых при данном

           текущем основании.

       Все встречающиеся в  исходной  программе  целые  числа

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

  если перед числом не стоит операция  управления  основанием

  системы счисления.

       Целые числа должны находиться в диапазоне значений  от

  -2 147 483 648 до 2 147 483 647 для чисел со знаком  или  в

  диапазоне от 0 до 4 294 967 295 для чисел без знака.

       Отрицательным числам должен предшествовать знак минус,

  макроассемблер транслирует эти числа в  дополнительный  код

  (дополнение до двух). Для  положительных  чисел  знак  плюс

  является необязательным.



       3.2.2. Числа с плавающей запятой


       Числа с плавающей запятой могут употребляться в дирек-

  тивах   .F_FLOATING   (.FLOAT),   .D_FLOATING    (.DOUBLE),

  .G_FLOATING и .H_FLOATING, а также в качестве  операндов  в

  инструкциях, выполняющих действия над числами  с  плавающей

  запятой. Число с плавающей запятой не может  использоваться

  в выражениях или совместно с бинарной  или  унарной  опера-

  цией, за исключением  унарного  плюса,  унарного  минуса  и



                           - 24 -

                        00152-01 35 01


  унарной операции формата с плавающей запятой (^F).

       Число с плавающей запятой может  быть  специфицировано

  как с показателем степени, так и без показателя степени.

       Форматы

  числа с плавающей запятой без показателя степени:

        SNN

        SNN.NN

        SNN.

  Числа с плавающей запятой с показателем степени:

       SNNESNN

       SNN.NNESNN

       SNN.ESNN

  где S - необязательный знак;

      NN - последовательность десятичных цифр в диапазоне

           от 0 до 9.

       Десятичная точка может появляться в любом месте справа

  от первой цифры. Отметим, что число с плавающей запятой  не

  может начинаться с десятичной точки, поскольку в таком слу-

  чае программа макроассемблер будет обрабатывать  это  число

  как символ, определенный пользователем.

       Числа с плавающей запятой могут быть одинарной точнос-

  ти (32 разряда), двойной точности (64 разряда) и  расширен-

  ной точности (128 разрядов). Степень точности составляет  7

  цифр для чисел одинарной точности, 16 цифр для чисел  двой-

  ной точности и 33 цифры для чисел расширенной точности.

       Величина неотрицательного числа с плавающей запятой не

  может быть меньше, чем приблизительно  0.29е-38  и  больше,




                           - 25 -

                        00152-01 35 01


  чем приблизительно 1.7е38.

       Числа с плавающей  запятой  одинарной  точности  могут

  либо округляться (по умолчанию), либо усекаться. Должны  ли

  числа с плавающей запятой округляться или усекаться опреде-

  ляется директивами .ENABLE и .DISABLE.  Числа  с  плавающей

  запятой двойной  точности  и  расширенной  точности  всегда

  округляются.

       Внутренний  формат  представления  чисел  с  плавающей

  запятой описывается в документе [2].



       3.2.3. Десятичные числа в упакованном формате


       Десятичные числа в упакованном формате могут  употреб-

  ляться только совместно с директивой .PACKED.

       Формат

       SNN

  где S - необязательный знак;

      NN - последовательность, состояшая минимум из 1,

           максимум из 31 десятичных цифр в диапазоне

           от 0 до 9.

       Десятичное число в упакованном формате не может  иметь

  в своем составе ни десятичной точки, ни показателя степени.

       Более подробно о десятичных числах в упакованном  фор-

  мате описывается в документе [2].











                           - 26 -

                        00152-01 35 01


       3.3. Символы


       В исходных программах, написанных  на  языке  макроас-

  семблер, допустимы символы следующих трех типов:

       1) постоянные символы;

       2) символы, определяемые пользователем;

       3) имена макрокоманд.



       3.3.1. Постоянные символы


       К постоянным символам относятся мнемонические  обозна-

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

  и имена регистров. Мнемонические обозначения не нуждаются в

  предварительном определении того, как они будут определять-

  ся в поле операции исходного предложения языка макроассемб-

  лер.  Не  требуют  предварительного  определения  и   имена

  регистров при употреблении их для указания режимов  адреса-

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

  ни один из символов, определяемых пользователем,  не  может

  совпадать ни с одним из  имен  регистров,  перечисленных  в

  табл. 4. 16 регистров общего назначения, принадлежащих про-

  цессору могут быть  определены  в  исходной  программе  как

  показано в табл. 4.














                           - 27 -

                        00152-01 35 01


                                                    Таблица 4

  -----------------------------------------------------------

  Имя регистра  !      Назначение регистра

  -----------------------------------------------------------

     R0         ! Регистр общего назначения 0

     R1         ! Регистр общего назначения 1

     R2         ! Регистр общего назначения 2

     .          !         .

     .          !         .

     .          !         .

    R11         ! Регистр общего назначения 11

    R12 или AP  ! Регистр общего  назначения  12  или указа-

                ! тель аргумента. Если  регистр  R12 исполь-

                ! зуется в качестве указателя аргумента, ре-

                ! комендуется употреблять  имя  ар, если ре-

                ! гистр R12 используется в  качестве регист-

                ! ра общего назначения,  рекомендуется упот-

                ! реблять имя R12

    FR          ! Указатель кадра

    SP          ! Указатель стека

    PC          ! Счетчик инструкций



       3.3.2. Символы, определяемые пользователем,  и

              имена макрокоманд


       Символы, определяемые  пользователем,  могут  употреб-

  ляться в качестве меток, или же с помощью оператора прямого

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


                           - 28 -

                        00152-01 35 01


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

  ляться в любом выражении.

       Следующие правила  действуют  при  создании  символов,

  определяемых пользователем:

       1) символы, определяемые пользователем, могут включать

  в себя алфавитно-цифровые знаки,  знак  подчеркивания  (_),

  знак денежной единицы ($) и точку (.).  Любой  другой  знак

  является ограничением символа;

       2) первым знаком символа не должна быть цифра;

       3) символ должен быть уникальным и  может  включать  в

  себя не более 31 знака;

       4) знак денежной единицы ($) резервируется  для  имен,

  определяемых разработчиком операционной системы МОС ВП. Это

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

  (в состав которого не входит знак денежной единицы) не вой-

  дет в конфликт с именем, определенным разработчиком (в сос-

  тав которого входит знак денежной единицы);

       5) точка (.) не должна употребляться ни в  каких  гло-

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

  таких как фортран, не допускается употребление точки в сим-

  волических именах.

       Имена макрокоманд подчиняются тем же самым правилам  и

  соглашениям, установленным для символов, определяемых поль-

  зователем. Символы,  определяемые  пользователем,  и  имена

  макрокоманд не вступают в конфликт, то есть одно и тоже имя

  может использоваться как символ,  определяемый  пользовате-

  лем, и как макрокоманда. Однако, чтобы  избежать  путаницы,




                           - 29 -

                        00152-01 35 01


  символам, определяемым пользователем, и макрокомандам  сле-

  дует давать различные имена.



       3.3.3. Определение значений символов


       Конкретное значение символа зависит от того, как  этот

  символ в программе  используется.  В  языке  макроассемблер

  применяются различные способы для определения значений сим-

  волов в зависимости от того, находится  ли  этот  символ  в

  поле операции или в поле операнда.

       Символ в поле операции может быть либо постоянным сим-

  волом, либо именем  макрокоманды.  В  языке  макроассемблер

  поиск определения символа производится в следующем порядке:

       1) среди заранее определяемых имен макрокоманд;

       2) среди кодов операций, определенных пользователем;

       3) среди постоянных символов (инструкций и директив);

       4) в библиотеках макрокоманд.

       Такой порядок поиска значения позволяет переопределять

  постоянный символ с помощью имени макрокоманды.  Если  сим-

  вол, встреченный в поле операции, не является  ни  макроко-

  мандой, ни постоянным символом, то  выдается  сообщение  об

  ошибке.

       Символ в поле  операнда  должен  быть  либо  символом,

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

       Символы, определяемые пользователем,  могут  быть  как

  глобальными (внешними) символами, так и  локальными  (внут-

  ренними). Является ли символ локальным или глобальным зави-

  сит от его использования в исходной программе.



                           - 30 -

                        00152-01 35 01


       К локальному символу могут производиться ссылки только

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

  символы с одинаковыми именами определены в различных  моду-

  лях, то эти символы  являются  совершенно  независимыми.  К

  определению же  глобального  символа  допустимы  ссылки  из

  любого модуля программы.

       Обычно при определении символов, определяемых  пользо-

  вателем, программа макроассемблер обрабатывает их  как  все

  локальные. Однако с помощью одного из трех следующих спосо-

  бов определение символа может быть об'явлено глобальным:

       1) путем использования двух двоеточий (::) при опреде-

  лении метки;

       2) путем использования двух знаков  равенства  (==)  в

  операторе прямого присваивания;

       3) путем использования директив  .GLOBAL,  .ENTRY  или

  .WEAK.

       Если символ определен в данном модуле и  из  этого  же

  модуля к нему производится ссылка,  то  программа  макроас-

  семблер рассматривает эту ссылку  как  внутреннюю.  Если  к

  символу производится ссылка из  модуля,  в  котором  данный

  символ не определен, то программа макроассемблер рассматри-

  вает такую ссылку как внешнюю (то есть символ  определен  в

  другом модуле). Для того, чтобы сделать недопустимыми ссыл-

  ки к символам, не определенным  в  данном  текущем  модуле,

  может быть использована директива .DISABLE. В  этом  случае

  для определения того, что данная  ссылка  является  внешней

  ссылкой, следует использовать директиву .EXTERNAL.




                           - 31 -

                        00152-01 35 01


       3.4. Локальные метки


       Локальные метки используются для идентификации адресов

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

       Формат:

       NN$

  где NN - десятичное целое число в диапазоне от 1 до 65535.

       Локальные метки могут использоваться  так  же,  как  и

  символические метки, определяемые пользователем, но со сле-

  дующими отличиями:

       - к локальным меткам можно ссылаться только  из  блока

         локальных меток исходной программы,  в  котором  они

         появились;

       - локальные метки могут повторно использоваться в дру-

         гом блоке локальных меток исходной программы;

       - локальные метки не появляются в таблице символов  и,

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

         ческого отладчика;

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

         директивой .END. По соглашению локальные метки  рас-

         полагаются так же, как метки предложения -  с  левой

         стороны исходного текста. Хотя локальные метки могут

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

         ко следует располагать их в каждом  блоке  локальных

         меток в порядке возрастания номеров.

       Локальные метки удобно использовать в качестве адресов

  в инструкциях относительного перехода, если эти адреса ука-

  зываются только в пределах данного блока  локальных  меток.



                           - 32 -

                        00152-01 35 01


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

  ссылка к которым осуществляется в пределах небольшого блока

  локальных меток исходной  программы  и  адресов,  ссылка  к

  которым осуществляется в пределах всего модуля. Недостатком

  локальных меток является то, что их числовые имена не  поз-

  воляют показать их назначение в  программе.  Следовательно,

  локальные метки не следует использовать для пометки  после-

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

  связанными. Вместо  локальных  меток  следует  использовать

  символы, определяемые пользователем.

       Рекомендуется пользователям создавать локальные  метки

  только в диапазоне от 1$ до 29999$, поскольку  в  диапазоне

  от 30000$ до 65535$ программа макроассемблер  автоматически

  создает локальные метки, которые используются в макрокоман-

  дах.

       Блок локальных меток, в  котором  действуют  локальные

  метки, ограничивается следующими предложениями:

       - метками, определяемыми пользователем;

       - директивами .PSеCT;

       - директивами .DISABLE и .ENABLE,  с  помощью  которых

  блок локальных меток может быть расширен за пределы,  обус-

  лавливаемые метками пользователя и директивами .PSECT.

       Обычно блок локальных меток ограничивается двумя  мет-

  ками, определяемыми пользователем.  Однако  блок  локальных

  меток начавшийся с директивы .ENABLE LOKAL_BLOCK завершает-

  ся только следующими предложениями:

       - второй директивой .ENABLE LOKAL_BLOCK;




                           - 33 -

                        00152-01 35 01


       - директивой .DISABLE LOKAL_BLOCк, за которой  следует

  метка, определяемая пользователем, или директива .PSECT.

       Хотя блоки локальных меток и могут быть  расширены  от

  одной программной секции до другой, рекомендуется, чтобы  к

  локальным меткам одной программной  секции  не  происходило

  ссылок из другой программной секции.  Рекомендуется  всегда

  для ограничения блоков локальных меток использовать  симво-

  лы, определяемые пользователем.

       Локальные метки можно сохранить для будущих  ссылок  в

  тексте программной секции, в которой они  были  определены;

  описания    директив    .SAVE_PSECT     [LOKAL_BLOCK]     и

  .RESTORE_PSECT (см. раздел 5).

       Приведенный пример иллюстрирует употребление локальных

  меток.

       Пример.

  LOG1: MOVW  A, R0         ; Начинается блок локальных

                            ; меток

  20$:  SUBW2 B, R0         ; Определяется локальная метка

                            ; 20$

        BGTR  20$           ; Условный переход на локальную

                            ; метку

        INCW  R0            ;

  LOG2: MOVW  C, R1         ; Заканчивается предыдущий блок

                            ; Локальных меток и начинается

                            ; новый

        MOVW  F, R2         ;

  20$:  CMPW  R0, R1        ; Определяется локальная метка




                           - 34 -

                        00152-01 35 01


                            ; 20$

        BGTR  40$           ; Условный переход на локальную

                            ; метку 40$

        ADDW2 E, R0         ;

        BRB   20$           ; Безусловный переход на локаль-

                            ; ную метку

  40$:  MOVW  R2, EXT       ; Определяется локальная метка

                            ; 40$

        BRW   NEXT1         ; Безусловный переход на метку

                            ; определенную пользователем

        .ENABLE LOKAL_BLOCK ; Начало блока локальных меток,

                            ; который не будет ограничен

                            ; меткой, определенной пользова-

                            ; телем

  LAB1: ADDL3 R0, R1, R3    ;

        CMPL R2, R3         ;

        BRB  1$             ;

  LAB2: SUBL2 R2, R3        ; LAB2 не является началом оче-

                            ; редного блока локальных метоK

  1$:   SUBL2 R2, R3        ; Определение локальной метки 1$

        BGTR  2$            ; Условный переход на локальную

                            ; метку

        INCL  R0            ;

        INCL  R1            ;

        BRB   NEXT2         ;

  2$:   INCL  R1            ; Определение локальной метки

                            ; 2$




                           - 35 -

                        00152-01 35 01


        DEKL  R0            ;

        .DISABLE LOKAL_BLOCK; Завершение блока локальных

                            ; меток

  NEXT2: MOVL D, R4         ;



       3.5. Термы и выражения


       Термом может быть любой из следующих элементов:

       - число;

       - символ;

       - текущий счеткик адресов программы;

       - текстовая операция, за которой следует текст;

       - любой  из  перечисленных  элементов,  перед  которым

  стоит знак унарной операции.

       Программа макроассемблер вычисляет значения термов как

  значения длинных слов  (четырехбайтные).  Если  в  качестве

  терма употребляется неопределенный символ, то значение это-

  го терма определяет компоновщик. Значение текущего счетчика

  адресов программы в начале текущего операнда.

       Выражения представляют собой комбинации термов,  об'е-

  диненных бинарными операциями  (подраздел  3.7.);  значения

  выражений вычисляются как значения длинных  слов  (четырех-

  байтные). Программа макроассемблер вычисляет значение выра-

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

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

  использованы угловые скобки (< >). Любая  часть  выражения,

  заключенная в угловые скобки, обрабатывается в первую  оче-

  редь  до  получения  некоторого  значения,  которое   затем



                           - 36 -

                        00152-01 35 01


  используется для вычисления данного выражения в целом. Нап-

  ример, выражения а*B+с и а*<B+C> являются различными. Угло-

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

  ния унарной операции на целое выражение, например, -<а+B>.

       Следует заметить, что унарная операция считается  сос-

  тавной частью терма. Следовательно, программа  макроассемб-

  лер выполняет действие,  указанное  унарной  операцией,  до

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

       Все выражения делятся на три категории:

       1) относительные выражения;

       2) абсолютные выражения;

       3) внешние (глобальные) выражения.

       Выражение является относительным,  если  его  значение

  фиксировано относительно начала программной секции, в кото-

  рой это  выражение  появилось.  Текущее  выражение  сетчика

  адресов программы является относительным выражением в отно-

  сительной программной секции.

       Выражение является абсолютным, если его значение опре-

  деляется во время трансляции и является  константой.  Абсо-

  лютным является выражение, все термы которого являются чис-

  лами. Выражение, содержащее относительный терм, из которого

  вычитается другой относительный терм из той же самой  прог-

  раммной секции, является абсолютным, поскольку такое  выра-

  жение сводится к константе, определяемой во время  трансля-

  ции.

       Выражение является внешним, если в его  состав  входят

  один или несколько символов, неопределенных в текущем моду-




                           - 37 -

                        00152-01 35 01


  ле.

       В большинстве макрокоманд могут употребляться  выраже-

  ния любого типа. Однако в некоторых  случаях  на  выражения

  накладываются некоторые ограничения. Это такие случаи, ког-

  да выражения употребляются:

       - в директиве выравнивания .ALIGN;

       - в директивах распределения памяти .BLKX;

       - в директивах блоков условной трансляции .IF и .IIF;

       - в директиве блока повторений .REPEAT;

       - в директиве определения кода инструкции .OPDEF;

       - в директиве точки входа .ENTRY;

       - в качестве  коэффициентов  повторений  в  директивах

         .BYTE, .LONG, .WORD, .SIGNED_BYTE, и SIGNеD_WORD;

       - в операторах прямого присваивания.

       Описания всех перечисленных директив, кроме  директивы

  .REPEAT (см. раздел 5).  Описание  директивы  .REPEAT  (см.

  раздел 6). Выражения,  которые  употребляются  совместно  с

  этими директивами  и  в  операторах  прямого  присваивания,

  могут включать в себя только такие  символы,  которые  были

  предварительно определены в текущем модуле.  Они  не  могут

  включать в себя ни внешние символы, ни символы,  определяе-

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

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

  абсолютными. Выражения в  операторах  прямого  присваивания

  могут быть относительными.

       Рассмотрим пример, иллюстрирующий использование  выра-

  жений.




                           - 38 -

                        00152-01 35 01


       Пример.



  BETA = 5*60             ; 5*60 абсолютное выражение

         .BLKW  BETA+100  ; BETA+100 абсолютное выражение

  M:     .BLKW  BETA      ; Относительное выражение

         ALPHA=M+BETA+200 ; ALPHA относительное выражение

  N:     .BLKW  N-M       ; N-м абсолютное выражение

         .WORD  K-M       ; K-M абсолютное выражение

  K:     .BLKW  DELTA+2   ; Внешние выражение, т.к.

                          ; Символ DELTA является внешним



       3.6. Унарные операции


       Унарные операции модифицируют  терм  или  выражение  и

  указывают на операцию, которая должна  быть  выполнена  над

  этим термом  или  выражением.  Выражение,  модифицированное

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

  Унарные  операции  могут  использоваться,  чтобы   показать

  является ли данный терм  или  выражение  положительным  или

  отрицательным (если унарный плюс или минус не  указаны,  по

  умолчанию значение является положительным). В табл. 5  соб-

  рана краткая информация по унарным операциям.















                           - 39 -

                        00152-01 35 01


                                                    Таблица 5

                       Унарные операции

  -----------------------------------------------------------

  Знак     ! Наименова- !    Пример   !   Выполняемая

           !    ние     !             !    операция

  -----------------------------------------------------------

     +     ! Знак плюс  !+A           ! Дает    положительное

           !            !             ! значение а

     -     ! Знак минус !-А           ! Дает    отрицательное

           !            !             ! (в   виде  дополнения

           !            !             ! до  двух)  значение а

     ^B    ! Знак двоич-!^B11000111   ! Интерпретирует  число

           ! ного осно- !             ! 11000111 как двоичное

           ! вания      !             !

     ^D    ! Знак деся- !^D127        ! Интерпретирует  число

           ! тичного    !             ! 127 как десятичное

           ! основания  !             !

     ^О    ! Знак вось- !^О34         ! Интерпретирует  число

           ! меричного  !             ! 34 как восьмеричное

           ! основания  !             !

     ^X    ! Знак шест- !^XFGF9       ! Интерпретирует  число

           ! надцатерич-!             ! FGF9  как  шестнадца-

           ! ного осно- !             ! теричное

           ! вания      !             !

     ^А    ! Знак опера-!^А/АВС/      ! Порождает строку

           ! ции  КОИ-8 !             ! кодов  КОИ-8;  знаки,

           !            !             ! заключенные    между




                           - 40 -

                        00152-01 35 01


                                          Продолжение табл. 5

  -----------------------------------------------------------

  Знак     ! Наименова- !    Пример   !   Выполняемая

           !    ние     !             !    операция

  -----------------------------------------------------------

           !            !             ! парными ограничителя-

           !            !             ! ми,  преобразуются  в

           !            !             ! коды КОИ-8

     ^М    ! Знак опера-!#^М<R3,R4,R5>! Определяет   регистры

           ! ции  ре-   !             ! R3,R4,R5 в  регистро-

           ! гистровой  !             ! вой маске

           ! маски      !             !

     ^F    ! Знак форма-!^F3.0        ! Интерпретирует  число

           ! та с пла-  !             ! 3.0 как число с  пла-

           ! вающей за- !             ! вающей запятой

           ! пятой      !             !

     ^С    ! Знак допол-!^С24         ! Выполняет  преобразо-

           ! тельного   !             ! вание   десятичного

           ! кода       !             ! значения  24 в допол-

           !            !             ! нительный  код   (до-

           !            !             ! полнение до единицы)


       С единичным термом или  с  выражением,  заключенным  в

  угловые скобки, допустимо  использование  более  чем  одной

  унарной операции. Например, -  +  -  а.  Такое  предложение

  эквивалентно следующему: - < + < - а > > .







                           - 41 -

                        00152-01 35 01


       3.6.1. Операции управления основанием  системы

              счисления


       Программа макроассемблер воспринимает термы и  выраже-

  ния, значения  которых  представлены  в  четырех  различных

  основаниях системы счисления:

       1) в двоичном основании;

       2) в десятичном основании;

       3) в восьмеричном основании;

       4) в шестнадцатеричном основании.

       Выражения, значения которых  модифицируются  операцией

  управления основанием системы счисления, должны быть заклю-

  чены в угловые скобки.

       Форматы

       ^BNN

       ^DNN

       ^ONN

       ^XNN

  где NN - последовательность знаков, являющихся допусти-

           мыми для определяемого основания системы счис-

           ления.

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

  рассматриваемых оснований системы счисления.













                           - 42 -

                        00152-01 35 01


                                                 Таблица 6

    ------------------------------------------------------

    Формат !  Основание          !  Допустимые знаки

    ------------------------------------------------------

    ^BNN   !  Двоичное           !  0 и 1

    ^DNN   !  Десятичное         !  От 0 до 9

    ^ONN   !  Восьмеричное       !  От 0 до 7

    ^XNN   !  Шестнадцатеричное  !  От 0 до 9 и от а до F


       Операции управления основанием  счисления  могут  быть

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

  числовое значение. Операция управления основанием счисления

  оказывает воздействие только на  тот  терм  или  выражение,

  которое следует непосредственно  за  ним.  Результатом  его

  влияния является то, что данный терм или выражение  обраба-

  тываются в указанном основании счисления.

       Пример 1.

   .BYTE  ^B11001        ; Двоичное основание

   .WORD  ^D28           ; Десятичное основание

   .WORD  ^О6666         ; Восьмеричное основание

   .LONG  ^XFFF          ; Шестнадцатеричное основание

   .LONG  ^X<F1C2+2C+10> ; Все числа в выражении имеют

                         ; шестнадцатеричное основание

       Стрелка вверх (^) не может быть отделена  от  символов

  B, D, O и X, которые за ней следуют, но  в  целом  операция

  управления основанием счисления может быть отделена от тер-

  ма или выражения, которые обрабатываются в указанном  осно-

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


                           - 43 -

                        00152-01 35 01


       Операция десятичного основания счисления (^D), которая

  действует по умолчанию,  становится  необходимой  только  в

  выражении, перед которым  стоит  какая-то  другая  операция

  управления основанием  счисления.  В  примере  2  число  66

  интерпретировалось бы как восьмеричное число, если  бы  ему

  не предшествовала операция ^D.

       Пример 2.

       .WORD ^О<511 + 16 + ^D66>

       Правила  шестнадцатерично-десятичного   преобразования

  чисел описываются в приложении 3.



       3.6.2. Текстовые операции


       Текстовыми операциями являются операция КОИ-8  (^A)  и

  операция регистровой маски (^М).



       3.6.2.1. Операция ^А


       Операция ^А осуществляет преобразование последователь-

  ности печатных графических символов  в  восьмибайтные  коды

  КОИ-8, соответствующие этим символам, и сохраняет эти  коды

  в программе, отводя на один символ  один  байт.  Последова-

  тельность символов должна быть заключена в парные ограничи-

  тели.

       В качестве ограничителей  может  использоваться  любой

  печатный символ, за исключением пробела,  символа  горизон-

  тальной табуляции и точки с запятой (;).  Хотя  могут  быть

  использованы и алфавитно-цифровые символы в качестве  огра-




                           - 44 -

                        00152-01 35 01


  ничителей, но для избежания путаницы с этой целью  не  сле-

  дует использовать алфавитно-цифровые символы

       Формат

       ^Астрока

  где строка - ограниченная последовательность символов кода

               КОИ-8, размером от 1 до 16 символов.

       Ограниченная последовательность символов кода КОИ-8 не

  должна превышать размер, характерный для  операнда  данного

  типа данных. Если, например, операция ^а появляется в одном

  из операндов инструкции MOVW  (тип  данного  -  слово),  то

  ограниченная последовательность символов не  должна  содер-

  жать более двух символов.

       Пример.

   MOVW  #^A/NT/,R0   ; N помещается в младший байт,

                      ; T помещается в старший байт слова

   MOVL  #^A/GOLD/,R0 ; Поместить G, O, L, D в регистр R0

                      ; G помещается в младший байт,

                      ; D помещается в старший байт

                      ; длинного слова

   MOVL  #^A/АB/, R0  ; А, В помещаются в младшие байты

                      ; длинного слова, два старших байта

                      ; заполняются нулями



       3.6.2.2. Операция регистровой маски ^М


       Операция регистровой маски осуществляет преобразование

  обозначения регистра или списка обозначений регистров, зак-

  люченного в угловые скобки, в 1- или 2-х байтную  регистро-



                           - 45 -

                        00152-01 35 01


  вую маску. Эта регистровая маска  используется  директивами

  .ENTRY и .MASK.

       Форматы

       ^Mрегистр

       ^M<список регистров>

  где регистр - обозначение одного из регистров или специ-

                фикатора разрешения  арифметического  пре-

                рывания (IV или DV);

       Список регистров - список обозначений регистров  и/или

  спецификаторов разрешения арифметического прерывания,  раз-

  деленных запятыми.

       Операция регистровой маски осуществляет установку бита

  в регистровой  маске  для  каждого  указанного  обозначения

  регистра и разрешения арифметического прерывания. B табл. 7

  указаны биты регистровой маски,  соответствующие  тому  или

  иному обозначению регистра и спецификатора  арифметического

  прерывания.

                                                   Таблица 7

  ----------------------------------------------------------

  Обозначение  !  Разрешение арифметического   !   Биты

  регистра     !           прерывания          !

  ----------------------------------------------------------

  C R0 по R11  !             -                 ! с 0 по 11

  R12 или AP   !             -                 !   12

  FP           !             -                 !   13

  SP           !             IV                !   14

  -            !             DV                !   15




                           - 46 -

                        00152-01 35 01


       Когда операция регистровой маски используется совмест-

  но с инструкциями POPR или PUSHR,  с  ней  можно  указывать

  регистры с R0 по R11, R12 или аP, FP и SP.  В  этом  случае

  нельзя указывать  регистр  PC  и  спецификаторы  разрешения

  арифметического прерывания (IV и DV).

       Когда операция регистровой маски используется совмест-

  но с директивами .ENTRY или .MASK, с  ней  можно  указывать

  регистры с R2 по R11 и спецификаторы  разрешения  арифмети-

  ческого прерывания (IV и DV), но нельзя указывать  регистры

  R0, R1, FP, SP и PC. IV устанавливает ловушку по переполне-

  нию целых чисел, а DV устанавливает ловушку по переполнению

  десятичных чисел.

       Более подробную информацию о регистровых масках и спе-

  цификаторах  разрешения  арифметического  прерывания  можно

  получить в документе [2].

       Пример.

   PUSHR  #^M<R0,R1,R2>       ; Сохранить регистры R0, R1,R2

   POPR   #^M<R0,R1,R2>       ; Восстановить регистры

                              ; R0, R1, R2

   .ENTRY PROG, ^M<R3,R5,IV>  ; Сохранить регистры R3, R5 и

                              ; установить ловушку перепол-

                              ; нения целых чисел



       3.6.3. Операции числового представления


       К операциям числового представления относятся операция

  формата с плавающей  запятой  (^F)  и  операция  дополнения

  (^С).  Порядок  применения  этих  двух  операций  числового



                           - 47 -

                        00152-01 35 01


  представления поясняется в подпунктах 3.6.3.1, 3.6.3.2.



       3.6.3.1. Операция формата с плавающей запятой


       Операция формата с плавающей запятой (^F) воспринимает

  число с плавающей запятой и преобразует его  во  внутреннее

  представление (четырехбайтное значение). Это значение может

  быть использовано в любом выражении. Программа макроассемб-

  лер не производит обработки выражений с плавающей запятой.

       Формат

       ^Fлитерал

  где литерал - число с плавающей запятой.

       Операция  формата  с  плавающей  запятой   оказывается

  полезной  операцией,  поскольку  обеспечивает   возможность

  употребления чисел с плавающей запятой в инструкциях, восп-

  ринимающих только целые числа.

       Пример.

  MOVL  #^F5.6,R1  ; Инструкция MOVF является предпочтитель-

                   ; ной для пересылки числа с плавающей

  MOVF  #5.6,R1    ; запятой





       3.6.3.2. Операция дополнения


       Операция дополнения (^C) задает дополнение до  единицы

  (обратный код) указанного значения.








                           - 48 -

                        00152-01 35 01


       Формат

       ^Cтерм

  где терм - любой терм или выражение. Если указывается выра-

             жение,  оно  должно  быть  заключено  в  угловые

             скобки.

       До генерирования дополнения  программа  макроассемблер

  вычисляет значение терма  или  выражения  в  четырехбайтном

  формате.

       Пример.

       .LONG   ^C^XFF         ; Результатом является шестнад-

                              ; цатеричное число FFFFFF00

       .LONG   ^C25           ; Результатом является шестнад-

                              ; цатеричное число FFFFFFE6



       3.7. Бинарные операции


       В отличие от унарных операций, бинарные операции  ука-

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

  термами или выражениями. При  этом  выражения  должны  быть

  заключены в угловые скобки. В табл. 8 представлена  краткая

  информация по бинарным операциям.

















                           - 49 -

                        00152-01 35 01


                                                   Таблица 8

                       Бинарные операции

  ----------------------------------------------------------

   Знак    ! Наименование   ! Пример ! Выполняемое действие

           !                !        !

  ----------------------------------------------------------

     +     !      Плюс      ! а + в  ! Сложение

     -     !     Минус      ! а - в  ! Вычитание

     *     ! Звездочка      ! а * в  ! Умножение

     /     ! Косая черта    ! а / в  ! Деление

     @     ! Знак коммерчес-! а @ в  ! Арифметический сдвиг

           ! кое "эт"       !        !

     &     !Коммерческое "и"! а & в  ! Логическое "и"

     !     ! Восклицательный!        !

           ! знак           ! а ! в  ! Логическое "или"

     \     ! Обратная косая !        !

           ! черта          ! а \ в  ! Логическое исключаю-

           !                !        ! щее "или"


       Все бинарные операции имеют равный приоритет. Термы  и

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

  вом использования угловых скобок. Термы и выражения, заклю-

  ченные в угловые скобки обрабатываются в первую очередь,  а

  остальные операции выполняются по порядку, слева направо.

       Пример.

          .LONG   1 + 2 * 3               ; Равно 9

          .LONG   1 + <2 * 3>             ; Равно 7





                           - 50 -

                        00152-01 35 01


       Отметим, что в  результате  выполнения  всех  бинарных

  операций получается значение в четырехбайтном формате. Если

  в качестве операндов  используются  одно-  или  двухбайтные

  величины, то результат помещается в  младшие  байты  (байт)

  четырехбайтной области. Если  усечение  приводит  к  потере

  значимости, программа макроассемблер  выдает  сообщение  об

  ошибке.



       3.7.1. Операция арифметического сдвига


       Операция арифметического сдвига (@)  используется  для

  выполнения сдвига влево или вправо арифметических  величин.

  Первый аргумент сдвигается влево или вправо на число разря-

  дов, которое задается вторым аргументом. Если второй  аргу-

  мент является положительным, то первый аргумент  сдвигается

  влево; если второй аргумент является отрицательным,  первый

  аргумент сдвигается вправо. Если первый аргумент сдвигается

  влево, младшие разряды устанавливаются в нуль; если же пер-

  вый аргумент сдвигается вправо, то старшие  разряды  запол-

  няются значением, присутствовавшем в старшем знаковом  раз-

  ряде до сдвига (знаковый бит).

       Пример.

       .BYTE  ^B111@3        ; Результат 111000 (двоичное)

       .BYTE   1@4           ; Результат 10000 (двоичное)

  SD=2

       .LONG   1@SD          ; Результат 100 (двоичное)

       .LONG  ^B101@-SD      ; Результат 1

       .LONG  ^X2244@-4      ; Результат 224 (шестнадцате-



                           - 51 -

                        00152-01 35 01


                             ; ричное)



       3.7.2. Операция логическое "И"


       Операция логическое "и" (&) задает функцию  логическое

  "И" между двумя операндами.

       Пример.

  М = ^B10101

  N = ^B11110

          .LONG   M&N         ; результат 10100 (двоичное)



       3.7.3. Операция логическое "или"


       Операция логическое "или" (!) задает функцию  логичес-

  кое "или" между двумя операндами.

       Пример.

  M = ^В10100

  N = ^В10101

  K = ^B11000

          .LONG   M!N      ; Результат 10101 (двоичное)

          .LONG   M!K      ; Результат 11100 (двоичное)



       3.7.4. Операция логическое исключающее "или"


       Операция логическое исключающее "или" (\) задает функ-

  цию логическое исключающее "или" между двумя операндами.









                           - 52 -

                        00152-01 35 01


       Пример.

          M = ^В1010

          N = ^В1100

                  .LONG   M\N    ; Результат 0110 (двоичное)



       3.8. Операторы прямого присваивания


       С помощью оператора прямого присваивания символу прис-

  ваивается определенное  значение.  В  отличие  от  символа,

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

  ный с помощью оператора прямого  присваивания,  может  быть

  переопределен любое число раз.

       Форматы

       Символ = выражение

       Символ == выражение

  где символ - символ, определенный пользователем;

      выражение - любое выражение, не содержащее неопреде-

                  ленных символов.

       Посредством формата с  единственным  знаком  равенства

  (=) определяется локальный символ, а с  помощью  формата  с

  двумя знаками равенства (==) определяется  глобальный  сим-

  вол.

       Операторы прямого присваивания  подчиняются  следующим

  трем синтаксическим правилам:

       1) символ и выражение, определяющее значение  символа,

  должны разделяться  знаком  равенства  или  двойным  знаком

  равенства. Пробелы, предшествующие или следующие за  опера-

  тором прямого присваивания, не имеют значения при определе-



                           - 53 -

                        00152-01 35 01


  нии конечного значения;

       2) в одном операторе прямого присваивания  может  быть

  определен только один символ;

       3) за оператором прямого присваивания может  следовать

  только поле комментария.

       Кроме того, символ в  операторе  прямого  присваивания

  размещается в поле метки.

       Пример.

  VALUE == 4              ; Глобальный символ VALUE имеет

                          ; значение 4

  MIN = VALUE - 3         ; MIN имеет значение 1

  MAX = VALUE @ 3         ; MAX имеет значение 20 (шестнад-

                          ; цатеричное)

  MM = ^X100/^X10         ; MM имеет значение 10 (шестнадца-

                          ; теричное)

  V = 45 + 3              ; V имеет значение 48 (десятичное)



       3.9. Счетчик адресов программы


       Символ точка (.), которым обозначается текущий счетчик

  адресов программы, всегда  имеет  значение,  равное  адресу

  текущего байта. Программа макроассемблер в начале  трансля-

  ции и в начале каждой новой программной  секции  устанавли-

  вает значение этого счетчика равное 0.

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

  результате трансляции которого в об'ектном модуле распреде-

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

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


                           - 54 -

                        00152-01 35 01


  например, директива .LONG 0 приводит к увеличению  текущего

  счетчика адресов программы на 4.  Однако  оператор  прямого

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

  к увеличению значения текущего счетчика адресов  программы,

  поскольку в результате его трансляции не происходит распре-

  деления памяти.

       Счетчик адресов программы  может  быть  установлен  на

  определенное значение с помощью специальной формы оператора

  прямого присваивания. При этом значение счетчика может быть

  увеличено либо уменьшено. Явная установка значения счетчика

  адресов программы часто оказывается полезной при  определе-

  нии структур данных. Посредством явной  установки  значения

  счетчика адресов программы не следует производить  резерви-

  рование памяти, для этой цели следует использовать директи-

  вы .BLKX.

       Формат

       .=выражение

  где выражение - выражение, которое не содержит неопреде-

                  ленных символов.

       В перемещаемой программной секции указанное  выражение

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

  адресу в текущей программной секции. Оно может относиться к

  текущему счетчику инструкций.

       Пример.

   .=.+40                 ; Перевести счетчик инструкций

                          ; вперед

       Когда ранее определенная  программная  секция  продол-




                           - 55 -

                        00152-01 35 01


  жается в том же текущем модуле, текущий счетчик  инструкций

  устанавливается на  последнее  значение  текущего  счетчика

  инструкций в данной программной секции.

       Когда счетчик инструкций встречается в  поле  операнда

  инструкции, текущий счетчик инструкций  принимает  значение

  адреса данного операнда, а не значение адреса,  с  которого

  начинается данная инструкция. По этой причине текущий счет-

  чик инструкций обычно не используется в  качестве  элемента

  определителя операнда.








































                           - 56 -

                        00152-01 35 01


                     4. РЕЖИМЫ АДРЕСАЦИИ



       В данном разделе собрана информация по режимам адреса-

  ции ЭВМ СМ 1700, а также приведены примеры предложений язы-

  ка макроассемблер, в которых используются описываемые режи-

  мы адресации. Полная информация по режимам адресации предс-

  тавлена в документе [2].

       Всего существует четыре типа режимов адресации:

       1) адресация регистров общего назначения;

       2) адресация программного счетчика;

       3) индексация;

       4) адресация в инструкциях относительного перехода.

       Хотя режим индексации по сути является одним из  режи-

  мов адресации регистров общего назначения, этот режим расс-

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

  быть использован только в комбинации с другими типами режи-

  мов адресации.

       Краткая информация по режимам  адресации  приведена  в

  приложении 2.



       4.1. Режимы   адресации   регистров   общего

            назначения


       В  режимах  адресации  регистров   общего   назначения

  используются регистры с R0 по R12, указатель  аргумента  ар

  (то же самое, что и R12), указатель кадра  FP  и  указатель

  стека SP.





                           - 57 -

                        00152-01 35 01


       Существует восемь режимов адресации  регистров  общего

  назначения:

       1) регистровый режим;

       2) косвенно-регистровый режим;

       3) режим адресации с автоувеличением;

       4) режим косвенной адресации с автоувеличением;

       5) режим адресации с автоуменьшением;

       6) режим адресации по смещению;

       7) режим косвенной адресации по смещению;

       8) режим литеральной адресации.



       4.1.1. Регистровый режим


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

  регистра, к которому происходит обращение,  за  исключением

  следующих случаев:

       1) в случае операндов  в  виде  квадрослов,  операндов

  формата D, G и операндов с полем переменной длины,  операн-

  дом является конкатенация содержимого регистра N и содержи-

  мого регистра N+1;

       2) в случае операндов в виде октаслов и операндов фор-

  мата H операндом является конкатенация содержимого регистра

  N и регистров N+1, N+2, N+3.

       В каждом из этих случаев самые младшие байты  операнда

  содержатся в регистре N, а самые старшие в самом старшем из

  используемых регистров, в N+1, либо в N+3.

       Результат операции является непредсказуемым, если  при

  регистровом  режиме  используется  счетчик  инструкций  РС,



                           - 58 -

                        00152-01 35 01


  либо, если при работе с данными расширенного  типа  операнд

  распространяется на РС.

       Форматы

       RN

       AP

       FP

       SP

  где N - число в диапазоне от 0 до 12.

       Пример.

          CMPB    R0, R1  ; сравнить младшие байты R0

                          ; и R1

          BEQL    LABEL   ; если они совпадают, то пе-

                          ; рейти на LABEL

          CLRB    R0      ; очистить младший байт R0

          INCB    R1      ; добавить единицу к младшему

                          ; байту R1

  LABEL:  CLRQ    R2      ; очистить регистры R2 и R3



       4.1.2. Косвенно-регистровый режим


       При косвенно-регистровом режиме регистр содержит адрес

  операнда. Косвенно-регистровый режим можно использовать при

  индексации.


       Форматы

        (RN)

        (AP)

        (FP)




                           - 59 -

                        00152-01 35 01


        (SP)

  где N - число в диапазоне от 0 до 12.

       Пример.

       MOVAL  DATA1,R1  ; получить адрес данного DATA1 в R1

       MOVAL  DATA2,R2  ; получить адрес данного DATA2 в R1

       CMPL   (R1),(R2) ; сравнить значение

       BEQL   LAB       ; если равны, то перейти на LAB

       INCL   (R1)      ; если нет, то увеличить на 1 зна-

                        ; чение данного DATA1

  LAB: MOVL  (SP),R0    ; переслать верхний элемент стека

                        ; в R0



       4.1.3. Режим адресации с автоувеличением


       При  адресации  с  автоувеличением  указанный  регистр

  содержит адрес операнда. После обработки  адреса  операнда,

  содержащегося в операнде, процессор  производит  приращение

  адреса операнда на размер типа данных  операнда.  Процессор

  производит приращение содержимого регистра на 1,  2,  4,  8

  или 16 для соответствующих операндов в формате байта,  сло-

  ва, длинного слова, квадрослова, октаслова.

       Режим адресации с автоувеличением может быть использо-

  ван при индексации, однако индексный регистр не может  быть

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

  личением.

       Форматы

       (RN)+

       (AP)+



                           - 60 -

                        00152-01 35 01


       (FP)+

       (SP)+

  где N - число в диапазоне от 0 до 12.

       Пример.

  NOVAL FILE1,R0        ; Переслать адрес FILE1 в R0

  INCB  (R0)+           ; Добавить 1 к первому байту

                        ; файла FILE1

  CLRB  (R0)+           ; Очистить второй байт файла FILE 1



  MOVAL FILE2,R1        ; Переслать адрес FILE2 в R1

  CLRQ  (R1)+           ; Очистить первое и второе длинное

                        ; слово файла FILE2



  INCL  (R1)+           ; Добавить 1 к третьему длинному

                        ; слову файла FILE2





       4.1.4. Режим     косвенной     адресации     с

              автоувеличением


       При косвенной адресации  с  автоувеличением  указанный

  регистр содержит адрес, который является адресом, по  кото-

  рому хранится адрес операнда  (указатель  операнда).  После

  обработки адреса операнда процессор увеличивает  содержимое

  указанного регистра на 4 (количество байтов в адресе).

       Режим косвенной адресации с автоувеличением может быть

  использован  совместно  с  индексацией,  однако   индексный

  регистр не может быть тем же самым регистром, что указан  в



                           - 61 -

                        00152-01 35 01


  косвенной адресации с автоувеличением.

       Форматы

        @(RN)+

        @(AP)+

        @(FP)+

        @(SP)+

  где N - число в диапазоне от 0 до 12.

       Пример.

  MOVAL TABLE, R1  ; Получить адрес таблицы адресов в R1

  INCL  @(R1)+     ; Добавить 1 к длинному слову, адрес ко-

                   ; торого является первым в таблице адре-

                   ; сов, содержимое регистра R1 увеличива-

                   ; ется на 4

  CLRB  @(R1)+     ; Очистить байт, адрес которого является

                   ; вторым в таблице адресов, затем к соде-

                   ; ржимому R1 добавляется число 4

  MOVL  R0,@(R1)+  ; Переслать содержимое R0 по адресу, ко-

                   ; торый является третьим в таблице адре-

                   ; сов, затем к содержимому R1 добавляется

                   ; число 4





       4.1.5. Режим адресации с автоуменьшением


       При адресации с  автоуменьшением  процессор  уменьшает

  содержимое указанного регистра на размер типа  данных  опе-

  ранда, после чего регистр содержит адрес операнда.  Процес-

  сор уменьшает содержимое регистра на 1, 2, 4, 8 и  16  для,



                           - 62 -

                        00152-01 35 01


  соответствующих операндов в формате байта, слова,  длинного

  слова, квадрослова и октаслова.

       Режим адресации с автоуменьшением может быть использо-

  ван совместно с индексацией, однако  индексный  регистр  не

  может быть тем же самым, что указан в  режиме  адресации  с

  автоуменьшением.


       Форматы

        -(RN)

        -(AP)

        -(FP)

        -(SP)

  где N - число в диапазоне от 0 до 12.

       Пример.



  INCB    -(R1)  ; вычесть 1 из содержимого R1 и добавить

                 ; 1 к байту, адрес которого содержится в

                 ; R1

  CLRL    -(R2)  ; вычесть 4 из содержимого R2 и очистить

                 ; длинное слово, адрес которого содержится

                 ; в R2



       4.1.6. Режим адресации по смещению


       При использовании режима адресации по смещению адресом

  операнда является сумма  содержимого  регистра  и  смещения

  (знак распространен на длинное слово).

       Режим адресации по  смещению  может  быть  использован




                           - 63 -

                        00152-01 35 01


  совместно с индексацией.

       Форматы

       Смщ(RN)

       Смщ(AP)

       Смщ(FP)

       Смщ(SP)

  где N - число от 0 до 12;

      смщ - выражение, определяющее смещение; данное выраже-

            ние может  сопровождаться  одним  из  указателей

            длины смещения, которые указывают на  количество

            байтов, необходимых  для хранения данного смеще-

            ния. Указатели приведены в табл. 9.

                                                    Таблица 9

  -----------------------------------------------------------

  Указатель      !               Значение

  длины смещения !

  -----------------------------------------------------------

       B^        ! Для хранения  смещения требуется один байт

       W^        ! Для хранения  смещения требуется одно сло-

                 ! во (два байта)

       L^        ! Для хранения смещения требуется одно длин-

                 ! ное слово (4 байта)


       Если выражению не предшествует ни один указатель длины

  смещения, а значение выражения  известно,  тогда  программа

  макроассемблер распределяет  наименьшее  количество  байтов

  (1, 2 или 4), необходимых для хранения смещения. Если выра-

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


                           - 64 -

                        00152-01 35 01


  значения выражения не известно, то резервируется для  этого

  смещения одно слово (2 байта). Отметим, что как  перемещае-

  мые смещения, так и смещения, определяемые в исходной прог-

  рамме позже,  программа  макроассемблер  рассматривает  как

  неизвестные. Если действительное значение смещения не укла-

  дывается в отведенную память, компоновщик выдает  сообщение

  об ошибке.

       Пример.



  MOVAL TAB_ARG,R0   ; Получить в R0 адрес таблицы значений

                     ; аргументов

  CLRW  L^DCP(R0)    ; Очистить слово, адрес которого равен

                     ; значению выражения DSP плюс содержи-

                     ; мое регистра R0

                     ; смещение хранится в виде длинного

                     ; слова

  MOVL  RED(R0), R1  ; Переслать в R1 длинное слово,адрес

                     ; которого равен адресу таблицы

                     ; TAB_ARG плюс значение выражения RED

                     ; смещение хранится в виде слова, по-

                     ; скольку символ RED не определен

  INCB  B^10(R0)     ; Добавить 1 к байту, адрес которого

                     ; равен адресу таблицы TAB_ARG плюс 10

                     ; смещение хранится в виде байта


       Примечание. Если значение смещения равно 0 и не  опре-

  делена длина смещения, то  выбирается  косвенно-регистровый

  режим, вместо режима адресации по смещению.



                           - 65 -

                        00152-01 35 01


       4.1.7. Режим косвенной адресации по смещению



       В режиме косвенной адресации по смещению сумма  содер-

  жимого регистра и значения смещения (знак  распространяется

  на длинное слово) является адресом адреса операнда  (указа-

  тель операнда).

       Режим  косвенной  адресации  по  смещению  может  быть

  использован совместно с индексацией.

       Форматы

       @смщ(RN)

       @смщ(AP)

       @смщ(FP)

       @смщ(SP)

  где N - число в диапазоне от 0 до 12;

      смщ - выражение, определяющее смещение; данному выра-

            жению может предшествовать один  из  указателей

            длины смещения, который  определяет  количество

            байтов, требующихся для размещения данного сме-

            щения. Указатели приведены в табл. 10.

                                                  Таблица 10

  ----------------------------------------------------------

  Указатель      !               Значение

  длины смещения !

  ----------------------------------------------------------

       B^        ! Для хранения смещения требуется один байт

       W^        ! Для хранения смещения требуется одно сло-

                 ! во (два байта)




                           - 66 -

                        00152-01 35 01


                                        Продолжение табл. 10

  ----------------------------------------------------------

  Указатель      !               Значение

  длины смещения !

  ----------------------------------------------------------

       L^        ! Для хранения смещения требуется одно

                 ! длинное слово (4 байта)


       Если выражению не предшествует ни один указатель длины

  смещения, а значение выражения известно, то программа  мак-

  роассемблер размещает минимальное количество байтов  (1,  2

  или 4), необходимых для хранения  значения  смещения.  Если

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

  и значение выражения неизвестно, то для  смещения  резерви-

  руется одно слово (2 байта).  Отметим,  что  если  смещение

  является либо перемещаемым, либо  определяется  в  исходной

  программе позже, программа макроассемблер считает его неиз-

  вестным. Если действительное значения смещения не помещает-

  ся в отведенную память,  компоновщик  выдает  сообщение  об

  ошибке.


       Пример.

  MOVAL  FILE_PTR,R2     ; Получить в R2 адрес файла указа-

                         ; телей

  CLRL   @W^MAN(R2)      ; Очистить длинное слово, адрес ко-

                         ; торого хранится по адресу FILE_PTR

                         ; плюс значение MAN

                         ; для хранения смещения используется




                           - 67 -

                        00152-01 35 01


                         ; слово

  MOVL   @B^MAP(R2),R3   ; Получить в R3 длинное слово, адрес

                         ; которого хранится по адресу FILE_

                         ; PTR плюс значение MAP

                         ; для хранения смещения используется

                         ; слово

  TSTL   @32(R2)         ; Проверить длинное слово, адрес ко-

                         ; торого хранится по адресу FILE_PTR

                         ; полюс 32

                         ; для хранения смещения используется

                         ; слово



       4.1.8. Режим литеральной адресации



       При литеральной адресации значение литерала хранится в

  самом байте, указывающем на режим адресации.


       Форматы

       #литерал

       S^литерал

  где литерал - выражение, целая константа или константа

                с плавающей запятой.

       Литерал должен быть представлен в короткой литеральной

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

  от 0 до 63, а константы с плавающей запятой  должны  прини-

  мать одно из 64-х значений, указанных в табл. 11.  Короткие

  литералы с плавающей запятой хранятся в виде  трехразрядной

  дробной части. В табл. 11 показаны также значения (для каж-



                           - 68 -

                        00152-01 35 01


  дого литерала) показателя степени и дробной части. Информа-

  ция по формату коротких  литералов  приведена  в  документе

  [2].

                                                  Таблица 11

             Короткие литералы с плавающей запятой

  ----------------------------------------------------------

          !               Дробная часть

     1)   !-------------------------------------------------

   пс     !    !      !     !      !    !      !     !

          !  0 !  1   !  2  !  3   ! 4  !  5   !  6  !   7

          !    !      !     !      !    !      !     !

  ----------------------------------------------------------

      0   !0.5 !0.5625!0.625!0.6875!0.75!0.8125!0.875!0.9375

      1   !1.0 !1.125 !1.25 !1.37  !1.5 !1.625 !1.75 !1.875

      2   !2.0 !2.25  !2.5  !1.5   !3.0 !3.25  !3.5  !3.75

      3   !4.0 !4.5   !5.0  ! 5.5  !6.0 !6.5   !7.0  !7.5

      4   !8.0 !9.0   !10.0 !11.0  !12.0!13.0  !14.0 !15.0

      5   !16.0!18.0  !20.0 !22.0  !24.0!26.0  !28.0 !30.0

      6   !32.0!36.0  !40.0 !44.0  !48.0!52.0  !56.0 !60.0

      7   !64.0!72.0  !80.0 !88.0  !96.0!104.0 !112.0!120.0

  -------------------

         1)

       пс - показатель степени.

       Пример.

  MOVB    #2,R0      ; Переслать 2 в младший байт R0

  MOVL    S^LITER,R1 ; Значение LITER пересылается в R1

                     ; если значение LITER выходит из




                           - 69 -

                        00152-01 35 01


                     ; диапазона 0-63, то генерируется

                     ; ошибка

  MOVF    #2.25,R4   ; В R0 занесено число 2.25

       Примечания:

       1. Когда используется формат #литерал, программа  мак-

  роассемблер осуществляет выбор между литеральной адресацией

  и  непосредственной  адресацией.  Программа  макроассемблер

  выбирает непосредственную адресацию,  если  удовлетворяется

  любое из следующих условий:

       - значение литерала не укладывается в формат короткого
                                                        
  литерала;

       - литерал является перемещаемым  или  внешним  выраже-

  нием;

       - литерал  представляет  собой  выражение,  содержащее

  неопределенные символы.

       Различие между литеральной и непосредственной  адреса-

  цией заключается в об'еме памяти, необходимой для  хранения

  литерала в инструкции.

       2. Формат S^#литерал принуждает программу макроассемб-

  лер использовать литеральную адресацию.



       4.2. Режимы    адресации    через    счетчик

            инструкций


       В режимах адресации  через  счетчик  инструкций  PC  в

  качестве регистра общего  назначения  используется  счетчик

  инструкций РС. Существует пять различных режимов  адресации

  через счетчик инструкций:



                           - 70 -

                        00152-01 35 01


       1) относительная адресация;

       2) косвенная адресация;

       3) абсолютная адресация;

       4) непосредственная адресация;

       5) адресация общего вида.



       4.2.1. Режим относительной адресации


       При относительной адресации адресом операнда  является

  указанный адрес. Программа макроассемблер  запоминает  этот

  адрес как смещение относительно счетчика РС.

       Режим  относительной  адресации  может  использоваться

  совместно с индексацией.

       Формат

       Адрес

  где адрес - выражение, определяющее  адрес; данному выраже-

              нию может  предшествовать  один  из  указателей

              длины смещения, который указывает на количество

              байтов, необходимых для хранения смещения. Обо-

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

              щения приведено в табл. 12.

















                           - 71 -

                        00152-01 35 01


                                                   Таблица 12

  -----------------------------------------------------------

  Указатель      !                Значение

  длины смещения !

  -----------------------------------------------------------

        B^       ! Для хранения смещения  требуется один байт

        W^       ! Для хранения смещения требуется одно слово

                 ! (2 байта)

        L^       ! Для хранения смещения требуется одно длин-

                 ! ное слово (4 байта)


       Если выражению, определяющему адрес,  не  предшествует

  никакой указатель длины смещения, и значение данного  выра-

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

  меньшее количество байт (1,2 или 4), необходимых для хране-

  ния смещения.  Если  адресному  выражению  не  предшествует

  никакой указатель  длины  смещения,  и  значение  выражения

  неизвестно, то программа макроассемблер  использует  указа-

  тель длины смещения, принятый по умолчанию.  Если  адресное

  выражение определено в программе после оператора, в котором

  оно используется, или определено в другой программной  сек-

  ции, то программа макроассемблер считает, что его  значение

  неизвестно.

       Пример.



  MOVL W^<TAB+8>, R0   ; Получить в R0 длинное слово, распо-

                       ; ложенное по адресу TAB+8.

                       ; Для хранения смещения используется



                           - 72 -

                        00152-01 35 01


                       ; слово

  MOVL L^POINT, R1     ; Получить в R1 длинное слово, распо-

                       ; ложенное по адресу POINT.

                       ; Для хранения смещения используется

                       ; длинное слово.

  MOVL LABEL, R2       ; Получить в R2 длинное слово, распо-

                       ; ложенное по адресу LABEL,

                       ; если метка LABEL не определена в

                       ; данной программной секции, то ис-

                       ; пользуется длина смещения по умол-

                       ; чанию.





       4.2.2. Режим косвенной относительной адресации


       При косвенной относительной адресации указанный  адрес

  является адресом адреса операнда  (указатель  на  операнд).

  Программа макроассемблер хранит адрес в виде смещения отно-

  сительно счетчика инструкций РС.

       Косвенная относительная адресация может быть использо-

  вана совместно с индексацией.

       Формат

       @адрес

  где адрес - выражение, определяющее адрес; данному выраже-

              нию может  предшествовать  один из  указателей

              длины смещения, который  указывает  количество

              байтов,  необходимых  для  хранения  смещения.

              Указатели приведены в табл. 13.



                           - 73 -

                        00152-01 35 01


                                                   Таблица 13

  -----------------------------------------------------------

  Указатель      !                         Значение

  длины смещения !

  -----------------------------------------------------------

       B^        ! Для хранения  смещения требуется один байт

       W^        ! Для хранения смещения требуется одно слово

                 ! (два байта).

       L^        ! Для хранения смещения требуется одно длин-

                 ! ное слово (4 байта).


       Если адресному выражению не предшествует  ни  один  из

  указателей  длины  смещения,  и  значение  этого  выражения

  известно, то программа макроассемблер  выбирает  наименьшее

  количество байт (1, 2 или 4), необходимых для хранения это-

  го смещения. Если адресному выражению  не  предшествует  ни

  один из указателей длины  смещения,  и  значение  выражения

  неизвестно, программа макроассемблер использует длину  сме-

  щения, принятую по умолчанию. Если адресное выражение опре-

  делено в программе после оператора, в котором  оно  исполь-

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

  рамма макроассемблер считает, что его значение неизвестно.

       Пример.

  CLRB    @L^APTR+8   ; очистить байт, адрес которого хра-

                      ; нится по адресу APTR+8

                      ; для хранения смещения используется

                      ; длинное слово

  TSTL    @W^APTR     ; проверить длинное слово, адрес ко-



                           - 74 -

                        00152-01 35 01


                      ; торого хранится по адресу APTR

                      ; для хранения смещения используется

                      ; слово



       4.2.3. Режим абсолютной адресации


       В режиме абсолютной адресации указанный адрес является

  адресом операнда. Этот адрес хранится как  абсолютный  вир-

  туальный адрес (сравните с  относительной  адресацией,  при

  которой адрес хранится в виде смещения относительно счетчи-

  ка инструкций РС).

       Режим абсолютной адресации может  использоваться  сов-

  местно с индексацией.

       Формат

       @#адрес

  где адрес - выражение, определяющее адрес.

       Пример.


  CLRL  @#^X1000     ; Очистить содержимое длинного слова

                     ; по адресу 1000 (шестнадцатеричное)

  MOVB  @#BIG, R0    ; Получить в R0 байт, чей адрес BIG

                     ; этот адрес хранится в абсолютной

                     ; форме, а не в виде смещения.



       4.2.4. Режим непосредственной адресации


       При непосредственной адресации операндом является ука-

  занный литерал.





                           - 75 -

                        00152-01 35 01


       Форматы

       #литерал

       I^#литерал

  где литерал - выражение, целая константа, константа с

                плавающей запятой.

       Пример.

  MOVL    #1100,R0 ; Получить в R0 значение 1100.

                   ; Значение 1100 хранится в длинном

                   ; слове.

  MOVB    #DISK,R1 ; Значение символа  DISK пересылается

                   ; в младший байт регистра R1.

  MOVF    #0.3,R2  ; Получить в R2 значение 0.3

                   ; оно хранится в формате с плавающей

                   ; запятой в четырех байтах (оно не мо-

                   ; жет быть представлено в виде коротко-

                   ; го литерала)

  CMPL    I^#^#4,R3; Сравнить 4 с содержимым R3

                   ; число 4 хранится в длинном слове,

                   ; поскольку операция I^ указывает на не-

                   ; посредственную адресацию

       Примечания:

       1. Когда используется формат #литерал  программа  мак-

  роассемблер осуществляет  выбор,  использовать  литеральную

  адресацию (п. 4.1.8) или непосредственную  адресацию.  Если

  литерал представляет собой целое число в диапазоне от 0  до

  63 или константу с плавающей запятой, удовлетворяющую  фор-

  мату короткого литерала, программа  макроассемблер  исполь-




                           - 76 -

                        00152-01 35 01


  зует литеральную адресацию. Если литералом является выраже-

  ние, то  программа  макроассемблер  использует  литеральную

  адресацию при существовании всех следующих условий:

       - выражение является абсолютным;

       - выражение не содержит непосредственных символов;

       - значение выражения удовлетворяет  формату  короткого

  литерала.

       Во  всех  других  случаях   программа   макроассемблер

  использует режим непосредственной адресации.

       Различие между непосредственной и литеральной  адреса-

  цией заключается в об'еме памяти,  требуемом  для  хранения

  литерала в инструкции.  При  непосредственной  адресации  в

  зависимости от типа данных операнда литерал хранится в виде

  байта, слова или длинного слова.

       2. I^#литерал - это формат  вынуждает  программу  мак-

  роассемблер использовать непосредственную адресацию.

       3. Существует два способа спецификации чисел с плаваю-

  щей запятой - в виде числового значения или в виде символи-

  ческого имени. Программа макроассемблер по разному  обраба-

  тывает эти величины:

       - числовые значения  преобразуются  в  соответствующее

  внутреннее представление чисел с плавающей запятой;

       - символы не преобразуются,  программа  макроассемблер

  предполагает, что эти величины уже приведены к  внутреннему

  представлению чисел с плавающей запятой.

       После  получения  значения  программа   макроассемблер

  пытается преобразовать внутреннее представление этого  зна-




                           - 77 -

                        00152-01 35 01


  чения к формату короткого  литерала  с  плавающей  запятой.

  Если такая попытка не удается, используется  непосредствен-

  ная адресация; если же такая попытка удается,  используется

  литеральная адресация для коротких  литералов  с  плавающей

  запятой.



       4.2.5. Режим адресации общего вида


       При адресации общего вида адрес является адресом  опе-

  ранда. Компоновщик преобразует данный режим адресации  либо

  к относительной адресации,  либо  к  абсолютной  адресации.

  Если адрес является перемещаемым,  компоновщик  преобразует

  адресацию общего вида в относительную адресацию. Если адрес

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

  общего вида в абсолютную адресацию. Режим адресации  общего

  вида предназначается для  написания  позиционно-независимых

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

  мещаемым или  абсолютным.  В  случае  использования  режима

  адресации общего вида для  хранения  операнда  требуется  5

  байтов.

       Адресация общего вида может использоваться совместно с

  индексацией.

       Формат

       G^адрес

  где адрес - выражение, определяющее адрес.

       Пример.

  TSTL  G^ADR         ; проверяется длинное слово, поме-

                      ; ченное меткой ADR



                           - 78 -

                        00152-01 35 01


                      ; если метка определена как абсо-

                      ; лютная, то используется абсолютная

                      ; адресация, если метка определена

                      ; как перемещаемая, то - относитель-

                      ; ная адресация

  CALLS #4,G^COUNT    ; вызывается процедура COUNT с

                      ; четырьмя аргументами в стеке





       4.3. Режим индексации


       Режим индексации является режимом адресации  регистров

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

  комбинации с другим режимом адресации,  называемым  базовым

  режимом. Базовым режимом может быть любой режим  адресации,

  за исключением прямого обращения к регистру, непосредствен-

  ной адресации, литеральной адресации, индексации и  адреса-

  ции в инструкциях относительного  перехода.  Для  получения

  базового адреса первым программой макроассемблер  обрабаты-

  вается базовый режим адресации. Затем добавляется к базово-

  му адресу произведение содержимого  индексного  регистра  и

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

  является адресом операнда.

       Сочетая индексацию с другими режимами адресации  можно

  образовать следующие режимы адресации:

       - косвенно-регистровый с индексацией;

       - индексация с автоувеличением;

       - косвенная адресация с автоувеличением и индексацией;



                           - 79 -

                        00152-01 35 01


       - индексация с автоуменьшением;

       - адресация по смещению с индексацией;

       - косвенная адресация по смещению с индексацией;

       - относительная адресация с индексацией;

       - абсолютная адресация с индексацией;

       - адресация общего вида с индексацией.

       Для каждого из этих режимов процесс обработки базового

  режима адресации и добавление индексного регистра одинаков.

       Форматы

       База[RX]

       База[AP]

       База[FP]

       База[SP]

  где база - любой режим адресации, по которому определяется

             базовый адрес, за исключением прямого обращения

             к регистру, непосредственной адресации, литера-

             льной адресации, индексации и адресации в инст-

             рукциях относительного перехода;

      х - число в диапазоне от 0 до 12, определяющее

          индексный регистр.

       В табл. 14 приведен список режимов адресации с  индек-

  сацией.

       Пример.



  ;

  ; косвенно-регистровый с идексацией

  ;




                           - 80 -

                        00152-01 35 01


  STEP=10

         MOVAB   SYS,R4       ; получить в R4 адрес SYS

         MOVL    #STEP,R1     ; установить индексный регистр

         CLRB    (R4)[R1]     ; очистить байт, чей адрес ра-

                              ; вен адресу SYS плюс 10*1

         CLRL    (R4)[R1]     ; очистить длинное слово, чей

                              ; адрес равен адресу SYS плюс

                              ; 10*4

         CLRQ    (R4)[R1]     ; очистить квадрослово,

                              ; адрес которого равен адресу

                              ; SYS плюс 10*8

         CLRO    (R4)[R1]     ; очистить октаслово,

                              ; чей адрес равен адресу SYS

                              ; плюс 10*16

  ;

  ; индексация с автоувеличением

  ;

         CLRQ    (R4)+[R1]    ; очистить квадрослово,

                              ; чей адрес равен адресу SYS

                              ; плюс 10*8

  ;

  ; косвенная индексация с автоувеличением и индексацией

  ;

         MOVAB   LIST,R3      ; получить в R3 адрес LIST

         MOVL    #20,R2       ; установить индексный регистр

         CLRW    @(R3)+[R2]   ; очистить слово, чей адрес

                              ; равен 20*2 плюс адрес, хра-




                           - 81 -

                        00152-01 35 01


                              ; нящийся в LIST

                              ; R3 теперь содержит адрес

                              ; SYS+8

  ;

  ; косвенная индексация по смещению с индексацией

  ;

         MOVAL   ADA, R8      ; получить в R8 адрес ADA

         MOVL    #80, R1      ; установить индексный регистр

         TSTF    @16(R8)[R1]  ; проверить значение в формате

                              ; с плавающей запятой, чей ад-

                              ; рес равен 80*4 плюс адрес,

                              ; хранящийся по адресу (ADA+16)

                                                 Таблица 14

                Режимы адресации с индексацией

   --------------------------------------------------------

        Режим                                !Формат

   --------------------------------------------------------

                                             !     1)   2)

   Косвенно-регистровый с индексацией        ! (RN) [RX]

   Индексация с автоувеличением              ! (RN) + [RX]

   Косвенная адресация с автоувеличением     ! @(RN) + [RX]

   и индексацией                             !

   Индексация с автоуменьшением              ! -(RN)[RX]

                                             !    3)

   Адресация по смещению с индексацией       ! смщ (RN)[RX]

   Косвенная адресация по смещению с         ! @смщ(RN)[RX]

   индексацией                               !




                           - 82 -

                        00152-01 35 01


                                       Продолжение табл. 14

   --------------------------------------------------------

        Режим                                !Формат

   --------------------------------------------------------

                                             !      4)

   Относительная адресация с индексацией     ! Aдрес [RX]

   Косвенная относительная адресация с       ! @Aдрес[RX]

   индексацией                               !

   Абсолютная адресация с индексацией        ! @#Aдрес[RX]

   Адресация общего вида с индексацией       ! G^Aдрес[RX]

  -------------------

  1)
     (RN) -  любой регистр общего назначения: R0...R12, AP,

             FP, SP.

  2)
     [RX] -  любой регистр общего назначения: R0...R12, AP,

             FP, SP. При  индексации с автоувеличением, при

             косвенной адресации с автоувеличением и индек-

             сацией и  при индексации с автоуменьшением ре-

             гистр RX не  может быть одним и тем же регист-

             ром, что и RN.

  3)
     смщ   - выражение, определяющее смещение.

  4)
     адрес - выражение, определяющее адрес.

       Примечания:

       1. Если при базовом режиме адресации меняются содержи-

  мое указанного регистра (адресация с автоувеличением,  кос-

  венная адресация с автоувеличением, адресация с  автоумень-




                           - 83 -

                        00152-01 35 01


  шением), то этот же самый регистр не может быть указан  при

  индексации.

       2. Индексный регистр добавляется к адресу после  того,

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

  при косвенной  адресации  с  автоувеличением  и  индексации

  базовый регистр содержит адрес адреса операнда.  Содержимое

  индексного регистра (умноженное на количество единиц  длины

  операнда данного типа данных) складывается с  адресом  опе-

  ранда, а не с адресом, хранящемся в базовом регистре.



       4.4. Адресация в инструкциях  относительного

            перехода


       При этом режиме адресации адрес хранится как  подразу-

  меваемое смещение относительно счетчика инструкций РС. Этот

  режим адресации используется только в  инструкциях  относи-

  тельного перехода. Смещение для инструкций условного  пере-

  хода и для инструкции BRB хранится в  байте.  Смещение  для

  инструкции BRW хранится в слове (2 байта). Смещение в байте

  допускает адресацию на 127 байт вперед и на 128 байт назад.

  Смещение в слове допускает адресацию на 32 767 байт  вперед

  и на 32 768 байт назад. При данном режиме адресации  смеще-

  ние  считается  относительно  скорректированного   значения

  программного счетчика инструкций РС, то  есть  относительно

  байта, следующего за байтом или словом, содержащим значение

  смещения. Более подробная информация об инструкциях относи-

  тельного перехода приведена в документе [2].





                           - 84 -

                        00152-01 35 01


       Формат

       адрес

  где адрес - выражение, представляющее адрес.

       Пример.

  CMPL R0,R1          ; сравнить содержимое R0 и R1

  BEQL TEST1          ; по равенству - переход на метку

                      ; TEST1

  BRW  TEST2          ; безусловный переход на TEST2










































                           - 85 -

                        00152-01 35 01


           5. ОБЩИЕ ДИРЕКТИВЫ ЯЗЫКА МАКРОАССЕМБЛЕР



       Общие  директивы  языка  макроассемблер  предоставляют

  средства, позволяющие выполнять функции различных типов.  В

  табл. 15 приведено распределение общих директив по группам,

  в соответствии с выполняемыми ими функциями. В данном  раз-

  деле подробно описывается каждая из директив, приводятся их

  форматы и примеры использования. В приложении  2  приведена

  краткая информация по всем директивам языка макроассемблер.

                                                  Таблица 15

                       Краткие сведения

           об общих директивах языка макроассемблер

  ----------------------------------------------------------

            Группа               !   Директива

  ----------------------------------------------------------

  Директивы управления листингом ! .SHOW     (.LIST)

                                 ! .NOSHOW   (.NLIST)

                                 ! .TITLE

                                 ! .SUBTITLE (.SBTTL)

                                 ! .IDENT

                                 ! .PAGE

  Директивы вывода сообщений     ! .PRINT

                                 ! .WARN

                                 ! .ERROR

  Директивы дополнительных       ! .ENABLE   (.ENABL)

  возможностей                   ! .DISABLE  (.DSABL)

                                 ! .DEFAULT




                           - 86 -

                        00152-01 35 01


                                        Продолжение табл. 15

  ----------------------------------------------------------

            Группа               !   Директива

  ----------------------------------------------------------

  Директивы хранения данных      ! .BYTE

                                 ! .WORD

                                 ! .LONG

                                 ! .ADDRESS

                                 ! .QUAD

                                 ! .OCTA

                                 ! .PACKED

                                 ! .ASCII

                                 ! .ASCIC

                                 ! .ASCID

                                 ! .ASCIZ

                                 ! .F_FLOATING (.FLOAT)

                                 ! .D_FLOATING (.DOUBLE)

                                 ! .G_FLOATING

                                 ! .H_FLOATING

                                 ! .SIGNED_BYTE

                                 ! .SIGNED_WORD

  Директивы управления счетчиком ! .ALIGN

  инструкций                     ! .EVEN

                                 ! .ODD

                                 ! .BLKA

                                 ! .BLKB

                                 ! .BLKD




                           - 87 -

                        00152-01 35 01


                                        Продолжение табл. 15

  ----------------------------------------------------------

            Группа               !   Директива

  ----------------------------------------------------------

                                 ! .BLKF

                                 ! .BLKG

                                 ! .BLKH

                                 ! .BLKL

                                 ! .BLKO

                                 ! .BLKQ

                                 ! .BLKW

                                 ! .END

  Директивы секционирования      ! .PSECT

  программы                      ! .SAVE_PSECT    (.SAVE)

                                 ! .RESTORE_PSECT (.RESTORE)

  Директивы управления символами ! .GLOBAL        (.GLOBL)

                                 ! .EXTERNAL      (.EXTRN)

                                 ! .DEBUG

                                 ! .WEAK

  Директивы определения входной  ! .ENTRY

  точки программы                ! .TRANSFER

                                 ! .MASK

  Директивы и поддирективы       ! .IF

  условной трансляции            ! .ENDC

                                 ! .IF_FALSE      (.IFF)

                                 ! .IF_TRUE       (.IFT)

                                 ! .IF_TRUE_FALSE (.IFTF)




                           - 88 -

                        00152-01 35 01


                                        Продолжение табл. 15

  ----------------------------------------------------------

            Группа               !   Директива

  ----------------------------------------------------------

                                 ! .IIF

  Директивы перекрестных ссылок  ! .CROSS

                                 ! .NOCROSS

  Директивы генерирования        ! .ORDEF

  инструкций                     ! .REF1

                                 ! .REF2

                                 ! .REF4

                                 ! .REF8

                                 ! .REF16

  Директива дополнительной       ! .LINK

  компоновки                     !



       5.1. Директивы управления листингом



       .IDENT - директива идентификации
       --------------------------------

       Директива .IDENT является средством языка макроассемб-

  лер для идентификации об'ектного модуля. Такая  идентифика-

  ция дается в дополнение к  имени,  присвоенному  об'ектному

  модулю с помощью директивы .TITLE. В директиве .IDENT может

  быть указана строка символов, которой помечается  об'ектный

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

  файла листинга, а также появляется в об'ектном модуле.





                           - 89 -

                        00152-01 35 01


       Формат

       .IDENT строка

       Параметр

  строка

       - последовательность символов, содержащая от 1  до  31

         символа, с помощью которой выполняется идентификация

         данного модуля; данная строка символов подобна стро-

         ке, указывающей номер версии. Данная  строка  должна

         быть ограничена. Ограничителями могут служить  любые

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

         (<) и точки с запятой (;). Ограничительный  знак  не

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

       Пример.

   .IDENT #4-6#          ; номер версии и редакции

   строка символов 4-6 включена в об'ектный модуль.

       Примечания:

       1. Если  в  исходном  модуле  содержится  более  одной

  директивы .IDENT, то идентификация об'ектного  модуля  осу-

  ществляется на основе строки  символов  последней  из  всех

  директив .IDENT.

       2. Если символы ограничения строки не совпадаЮт друг с

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

  сообщение об ошибке.












                           - 90 -

                        00152-01 35 01



       .PAGE - директива перевода страницы
       -----------------------------------

       Директива .PAGE начинает в  листинге  новую  страницу.

  Сама директива в листинге не распечатывается.

       Директива .PAGE, входящая в  состав  макроопределения,

  игнорируется.  Операция  разбиения  листинга  на   страницы

  производится только во время расширения макрокоманды. Более

  подробные сведения (см. раздел 6).

       Формат

       .PAGE

       .SHOW и .NOSHOW - директивы управления листингом
       ------------------------------------------------


       Директивы .SHOW и  .NOSHOW  определяют  дополнительные

  возможности управления листингом исходного текста  програм-

  мы. В директивах .SHOW и .NOSHOW может  присутствовать  или

  отсутствовать спецификация списка аргументов.

       Если эти директивы заданы со  списком  аргументов,  то

  директива .SHOW вызывает включение в  файл  листинга  строк

  определенных типов, а директива .NOSHOW вызывает исключение

  из файла листинга строк определенных типов. Директивы .SHOW

  и .NOSHOW осуществляют управление листингом исходного текс-

  та блоков условной трансляции, макрокоманд и блоков  повто-

  рения.

       Если эти директивы заданы без аргументов, то они изме-

  няют значение счетчика уровня листинга. В исходном  состоя-

  нии значение счетчика листинга уровня равно нулю. При  каж-

  дом задании директивы .SHOW значение счетчика  уровня  лис-




                           - 91 -

                        00152-01 35 01


  тинга увеличивается, а при каждом задании директивы .NOSHOW

  значение счетчика уровня листинга уменьшается на 1.

       Если значение счетчика уровня является  отрицательным,

  то распечатка листинга подавляется (если строки не содержат

  ошибку). Наоборот, если значение счетчика  уровня  листинга

  является положительным, листинг формируется. Если  значение

  счетчика равно нулю, то строка либо  распечатывается,  либо

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

  ментов управления листингом.

       Форматы

       .SHOW

       .SHOW список аргументов

       .NOSHOW

       .NOSHOW список аргументов

       Параметр

  список аргументов

       - один или несколько символических аргументов, опреде-

         ление  которых  приведено  в  табл.  16.   Допустимо

         использование как полного, так и  краткого  форматов

         указанных аргументов. Каждый из символических  аргу-

         ментов может быть указан отдельно или в сочетании  с

         другими аргументами. Если указывается несколько сим-

         волических аргументов, то они должны быть  разделены

         пробелами или символами  табуляции,  запятыми.  Если

         какой-либо  аргумент  не  включен  явным  образом  в

         директиву управления, то на протяжении всей исходной

         программы подразумевается его значение по умолчанию.




                           - 92 -

                        00152-01 35 01


                                                    Таблица 16

       Символические аргументы директив .SHOW и .NOSHOW

  ------------------------------------------------------------

  Полный      !Краткий!Значение  !          Функция

  формат      !формат !   по     !

              !       !умолчанию !

  ------------------------------------------------------------

  BINARY      ! MEB   !    не    ! Распечатывает    расширения

              !       ! печатать ! макрокоманд  и   расширения

              !       !          ! блоков повторения,  которые

              !       !          ! генерируют  двоичный   код.

              !       !          ! функция   BINARY   является

              !       !          ! частным   случаем   функции

              !       !          ! EXPANSIONS

  CALLS       !MC     ! печатать ! Распечатывает  вызовы  мак-

              !       !          ! рокоманд  и  спецификаторов

              !       !          ! блоков повторений

  CONDITIONALS!CND    ! печатать ! Распечатывает  блоки услов-

              !       !          ! ной трансляции,  в  случае,

              !       !          ! если не  выполнены  условия

              !       !          ! их трансляции

  DEFINITIONS !MD     ! печатать ! Распечатывает   определения

              !       !          ! макрокоманд   и  расширения

              !       !          ! блоков повторений

  EXPANSIONS  !ME     !    не    ! Распечатывает    расширения

              !       ! печатать ! макрокоманд  и  блоков пов-

              !       !          ! торений




                           - 93 -

                        00152-01 35 01


       Пример.

          .MACRO  XX



            .

            .

            .

          .SHOW                   ; распечатать следующую

                                  ; строку

  X=.

          .NOSHOW                 ; не распечатывать остаток

            .                     ; расширения макрокоманды

            .

            .

          .ENDM

          .NOSHOW EXPANSIONS      ; не распечатывать

                                  ; расширения макрокоманд

          XX                      ; вызов макрокоманды XX

  X=.

       Примечания:

       1. Счетчик уровня листинга позволяет выполнить избира-

  тельную распечатку макрокоманд. В начале определения должна

  быть указана директива .NOSHOW с целью уменьшения  значения

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

  директиву .SHOW с целью  восстановления  значения  счетчика

  листинга до его прежнего значения.

       2. Альтернативными формами директив  .SHOW  И  .NOSHOW

  являются директивы .LIST и .NLIST.




                           - 94 -

                        00152-01 35 01



       .SUBTITLE - директива подзаголовка
       ----------------------------------

       По директиве  .SUBTITLE  макроассемблер  распечатывает

  строку текста в  таблице  содержания,  которая  формируется

  непосредственно перед  листингом  трансляции.  Кроме  того,

  макроассемблер распечатывает данную строку текста в качест-

  ве подзаголовка на второй строке каждого листинга  трансля-

  ции. Данный текст подзаголовка  распечатывается  на  каждой

  странице до тех пор пока в программе не будет  задана  сле-

  дующая директива .SUBTITLE с другим текстом.

       Формат

       .SUBTITLE комментарий

       Параметр

  комментарий

       - строка символов кода КОИ-8 размером от 1 до 40  сим-

         волов. Лишние символы отбрасываются.  Данная  строка

         символов представляет собой текстовую строку,  кото-

         рая должна распечатываться в таблице содержания и  в

         качестве подзаголовка в листинге трансляции.

       Пример.

       .SUBTITLE условная трансляция


  по данной директиве программа макроассемблер  распечатывает

  следующий текст в качестве подзаголовка в листинге трансля-

  ции:

       Условная трансляция


  кроме того, этот же текст распечатывается в таблице  содер-




                           - 95 -

                        00152-01 35 01


  жания листинга, в сопровождении номера  страницы  исходного

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

  директива .SUBTITLE. Таблица содержания изображена на  рис.

  1.


       Таблица содержания листинга

     (1)  5000 директивы макроассемблера

     (2)  300  определения макрокоманд

     (2)  2300 таблицы данных и исходные установки

     (3)  4800 главная программа

     (4)  2800 вычисления

     (4)  5000 программы ввода-вывода

     (5)  1300 условная трансляция

                             рис. 1


       Примечание. Альтернативной формой директивы  .SUBTITLE

  является директива .SBTTL.


       .TITLE - директива заголовка
       ---------------------------

       Посредством директивы .TITLE об'ектному  модулю  прис-

  ваивается имя. Это имя может состоть из 31 символа,  отлич-

  ных от пробела, следующих за директивой.

       Формат

       .TITLE имя модуля комментарий

       Параметры

  имя модуля

       - идентификатор размером от 1 до 31 символа.






                           - 96 -

                        00152-01 35 01


  комментарий

       - строка символов кода КОИ-8 размером от 1 до 40  сим-

         волов, лишние символы отбрасываются.

       Пример.


       .TITLE печать сообщений

       Примечания:

       1. Имя  модуля,  присваиваемое  с  помощью   директивы

  .TITLE, не имеет никакого отношения  к  спецификации  файла

  об'ектного модуля, которая указывается в  командной  строке

  для программы макроассемблер. Это то имя, которое появляет-

  ся в карте загрузки компоновщика, а также то  имя,  которое

  распознают системные программы библиотекарь или отладчик.


       2. Если директива .TITLE  не  указаное  то  об'ектному

  модулю присваивается имя по умолчанию .MAIN. Если в  исход-

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

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

  тив .TITLE.


       3. При обработке аргумента "имя модуля" программа мак-

  роассемблер игнорирует  все  пробелы  и  символы  табуляции

  вплоть до первого символа после директивы .TITLE, отличного

  от пробела и символа табуляции.













                           - 97 -

                        00152-01 35 01


       5.2. Директивы вывода сообщений



       .ERROR - директива вывода сообщения об ошибках
       -----------------------------------------------

       Задание директивы .ERROR заставляет программу макроас-

  семблер выводить сообщения об ощибках на терминал,  в  файл

  групповой регистрации и в файл листинга  (если  он  сущест-

  вует).

       Формат

       .ERROR [выражение]; комментарий

       Параметры

  выражение

       - выражение, значение  которого  выводится,  когда  во

         время трансляции встречается директива .ERROR.

  Комментарий

       - комментарий, который выводится во  время  трансляции

         по директиве .ERROR. Текст комментария должен  пред-

         варяться точкой с запятой (;).

       Пример.

   .IF GREATER     ARG-100

   .ERROR 5                   ; недопустимый аргумент

   .ENDC

       Если значение символа ARG больше  или  равно  100,  то

  выводится следующее сообщение об ошибке:

  &MACRO-E-GENERR, GENERATED ERROR:5 недопустимый аргумент









                           - 98 -

                        00152-01 35 01


       Примечания:

       1. Директивы .ERROR, .WARN, .PRINT называются директи-

  вами вывода сообщений. Они могут использоваться для  вывода

  информации, указывающей  на  то,  что  макровызов  содержит

  ошибку или недопустимый набор условий.

       2. По завершении трансляции на экране терминала  выво-

  дятся сообщения об ошибках, предупреждающие и  информацион-

  ные сообщения, а также  порядковые  номера  строк,  которые

  вызывали появление сообщений об  ошибке  и  предупреждающих

  сообщений. Более подробную информацию относительно  сообще-

  ний об ошибках и предупреждающих сообщений содержит [1].

       3. Если директива .ЕRROR включена в библиотеку  мокро-

  команд [1], то текст комментария должен завершаться  допол-

  нительным символом точка  с  запятой.  В  противном  случае

  программа библиотекарь лишит данную директиву  комментария,

  и этот комментарий не будет выведен при вызове  макрокоман-

  ды.

       4. Строки, содержащие директивы .ERROR не включяются в

  файл листинга.

       5. Если указанное в директиве .ERROR  выражение  имеет

  значение 0, оно не выводится в сообщении об ошибке.


       .PRINT - директива вывода сообщений
       -----------------------------------

       Директива .RPINT позволяет транслировать  информацион-

  ные сообщения. Данные сообщения состоят из значения некото-

  рого выражения и  текста  комментария,  которые  указаны  в

  директиве .PRINT. Для интерактивных заданий  информационные




                           - 99 -

                        00152-01 35 01


  сообщения выводятся на терминал, а для пакетных  заданий  в

  файл регистрации. Сообщение, выводимое по директиве .PRINT,

  не считается сообщением об ошибке или предупреждающим  соб-

  щением.

       Формат

       .PRINT [выражение] ;комментарий

       Параметры

  выражение

       - выражение, значение которого подлежит выводу в  сос-

         таве информационного сообщения, когда программа мак-

         роассемблер обрабатывает директиву .PRINт.

  Комментарий

       - текст  комментария,  который  выводится  в   составе

         информационного сообщения, когда программа  макроас-

         семблер обрабатывает директиву .PRINT.  Тексту  ком-

         ментария должна предшествовать точка с запятой (;).

       Пример.

       .PRINT 4 ; аргумент может принимать любые значения

       Примечания:

       1. Директивы .PRINT, .ERROR и .WARN называются  дирек-

  тивами сообщений. Они могут быть  использованы  для  вывода

  информации, указывающей  на  то,  что  макровызов  содержит

  ошибку или недопустимый набор условий.


       2. Если директива .PRINT включена в библиотеку  макро-

  команд [1], то комментарий должен завершаться  дополнитель-

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

  чен из директивы и не будет выводится при  вызове  макроко-



                           - 100 -

                        00152-01 35 01


  манды.


       3. Если выражение имеет хначение нуль, то это значение

  не выводится в составе информационного сообщения.


       .WARN - директива вывода предупреждающего
       -----------------------------------------
                           сообщения
                           ---------
       По директиве .WARN выводится предупреждающее сообщение

  на терминал, в файл групповой регистрации либо в файл  лис-

  тинга (если он существует).

       Формат

       .WARN [выражение] ; комментарий

       Параметры

  выражение

       - выражение, значение которого выводится при обработке

         директивы .WARN во время трансляции.

  Комментарий

       - текст комментария, который выводится  при  обработке

         директивы .WARN. Текст  комментария  должен  предва-

         ряться точкой с запятой.

       Пример.

       .IF DEFINED     AREA

       .IF GREATER     200-EXP

       .WARN           ; COPY DATA

       .ENDC

       .ENDC

       Если символ AREA  определен  и  значение  символа  EXP

  меньше или равно 200, то выводится следующее  предупреждаю-




                           - 101 -

                        00152-01 35 01


  щее сообщение:

  #MACRO-W-GENWRN, GENERATED WARNING:

                   COPY DATA

       Примечания:

       1. Директивы .WARN, .ERROR, .PRINT называются директи-

  вами вывода сообщений.  Они  могут  быть  использованы  для

  вывода информации, указывающей на то, что вызов макрокоман-

  ды содержит ошибку или недопустимый  набор  условий  (более

  полная информация по вызовам макрокоманд приведена в разде-

  ле 6).


       2. По завершении процесса  трансляуии программ,   мак-

  роассемблер выводит на терминал  общее  количество  ошибок,

  предупреждающих и информационных сообщений, а также  номера

  страниц и последовательные номера строк для строк,  которые

  вызвали вывод сообщений об ошибках и предупреждающих  сооб-

  щений (вывод может производится в групповой файл  регистра-

  ции). Более полная информация по сообщениям  об  ошибках  и

  предупреждающим сообщениям приведена в документе [1].


       3. Если директива .WARN включена в библиотеку макроко-

  манд [1], то текст комментария должен завершаться  дополни-

  тельной точкой с  запятой.  В  противном  случае  директива

  .WARN будет лишена этого параметра и при вызове макрокоман-

  ды текст комментария не будет выводиться.


       4. Строка, содержащая директиву .WARN не включается  в

  файл листинга.





                           - 102 -

                        00152-01 35 01


       5. Если  выражение,  указываемое  в  директиве  .WARN,

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

  предупреждающего сообщения.



       5.3. Директивы дополнительных возможностей



       .DEFAULT - директива управления значениями
       -------------------------------------------
                         по умолчанию
                         ------------

       Директива .DEFAULT определяет длину смещения по  умол-

  чанию для относительной адресации и для  косвенной  относи-

  тельной адресации.

       Формат

       .DEFAULT DISPLACEMENT, ключевое слово

       Параметр

  ключевое слово

       - одно из трех ключевых слов (BYTE, WORD, LONG),  ука-

         зывающих длину смещения по умолчанию.

       Пример.

   .DEFAULT DISPLACEMENT, BYTE    ; значением по умолчанию

                                  ; является байт

   MOVL   ABC,R2                  ; если не определена метка

                                  ; ABC, используется смеще-

                                  ; ние в один байт

   .DEFAULT DISPLACEMENT, WORD    ; значением по умолчанию

                                  ; является слово

   DECB   @DEF+6                  ; если не определена метка

                                  ; DEF, используется смеще-



                           - 103 -

                        00152-01 35 01


                                  ; ние в одно слово

       Примечания:

       1. Директива .DEFAULT не оказывает воздействия на зна-

  чение смещения по умолчанию для адресации по смещению и для

  косвенной адресации по смещению.

       2. Если в модуле не задана директива .DEFAULT, то дли-

  на смещения по умолчанию для косвенной относительной  адре-

  сации и для относительной адресации равна  одному  длинному

  слову.


       .DISABLE - директива запрещения выполнения функций
       --------------------------------------------------


       Задание директивы  .DISABLE  подавляет  или  запрещает

  указанные функции макроассемблера. Более подробная информа-

  ция содержится в описании директивы .ENABLE.

       ФормаT

       .DISABLE список аргументов

       Параметр

  список аргументов

       - один или несколько символических  аргументов,  пере-

         численных в табл. 17. В директиве допустимо  исполь-

         зование как полного формата, так и краткого  формата

         символических аргументов. Если указывается несколько

         символических аргументов, они должны быть  разделены

         запятыми, пробелами или символами табуляции.

       Примечание. Альтернативной формой  директивы  .DISABLE

  является директива .DSABL.





                           - 104 -

                        00152-01 35 01


       .ENABLE - директива управления выбором функций
       ----------------------------------------------

       Задание директивы .ENABLE разрешает указанные  функции

  макроассемблера. Директива .ENABLE и  ее  противоположность

  директива .DISABLE управляют следующими функциями программы

  макроассемблер:

       - создание блоков локальных меток;

       - об'явление всех локальных  символов  доступными  для

         отладчика и включение средств обратной трассировки;

       - указание о том, что ссылки на неопределенные символы

         являются внешними ссылками;

       - усечение или округление чисел  с  плавающей  запятой

         одинарной точности;

       - подавление распечатки символов, которые были опреде-

         лены, но на которые отсутствуют ссылки;

       - указание о том, что все ссылки на программный  счет-

         чик рс являются абсолютными, а не относительными.

       Формат

       .ENABLE список аргументов

       Параметр

  список аргументов

       - один или несколько  символических  аргументов,  (см.

         Табл. 17). Допустим как краткий, так и полный формат

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

       Если указывается несколько  символических  аргументов,

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

  лами табуляции.





                           - 105 -

                        00152-01 35 01


       Пример.

   .ENABLE GLOBAL              ; все неопределенные символы

                               ; рассматриваются как внешние

   .ENABLE LOCAL_BLOCK         ; завершается текущий

                               ; блок локальных меток

                               ; и начинается новый

       Примечание. Альтернативной  формой  директивы  .ENABLE

  является директива .ENABL.

                                                  Таблица 17

      Символические аргументы директив .ENABLE и .DISABLE

  ----------------------------------------------------------

         Формат      !Значение по!

  -------------------! умолчанию !   Выполняемая функция

    Полный   !Краткий!           !

  ----------------------------------------------------------

  ABSOLUTE   ! AMA   ! Запрещение! При разрешении этой функ-

             !       !           ! ции все относительные ад-

             !       !           ! реса  транслируются   как

             !       !           ! абсолютные адреса (режим

             !       !           ! адресации рс)

  DEBUG      ! DBG   ! Запрещение! При разрешении этой функ-

             !       !           ! ции все локальные симво-

             !       !           ! лы включаются в таблицу

             !       !           ! символов данного об'ек-

             !       !           ! тного модуля, которая

             !       !           ! используется отладчиком

  GLOBAL     ! GBL   ! Разрешение! При разрешении этой функ-




                           - 106 -

                        00152-01 35 01


                                        Продолжение табл. 17

  ----------------------------------------------------------

         Формат      !Значение по!

  -------------------! умолчанию !   Выполняемая функция

    Полный   !Краткий!           !

  ----------------------------------------------------------

             !       !           ! ции все неопределенные

             !       !           ! символы рассматриваются

             !       !           ! как внешние. При запре-

             !       !           ! щении этой функции любой

             !       !           ! неопределенный символ,

             !       !           ! который не указан в

             !       !           ! в списке директивы

             !       !           ! .EXTERNAL, вызывает появ-

             !       !           ! ление ошибки трансляции

  LOCAL_BLOCK! LSB   ! Запрещение! При разрешении этой функ-

             !       !           ! ции завершается текущий

             !       !           ! блок локальных меток и

             !       !           ! начинается новый. При

             !       !           ! запрещении этой функции

             !       !           ! текущий блок локальных

             !       !           ! меток просто завершается

  SUPPRESSION! SUP   ! Запрещение! При разрешении этой функ-

             !       !           ! ции все символы, которые

             !       !           ! определены, но к которым

             !       !           ! нет ссылок, не включают-

             !       !           ! ся в таблицу символов.




                           - 107 -

                        00152-01 35 01


                                        Продолжение табл. 17

  ----------------------------------------------------------

         Формат      !Значение по!

  -------------------! умолчанию !   Выполняемая функция

    Полный   !Краткий!           !

  ----------------------------------------------------------

             !       !           ! При запрещении этой функ-

             !       !           ! ции все определенные сим-

             !       !           ! волы включаются в таблицу

             !       !           ! символов

  TRACEBACK  ! TBK   ! Разрешение! При разрешении этой функ-

             !       !           ! ции имена программных се-

             !       !           ! кций и их длины, имена

             !       !           ! модулей и имена программ,

             !       !           ! включаются в об'ектный

             !       !           ! модуль для использования

             !       !           ! отладчиком; при запреще-

             !       !           ! нии макроассемблер исклю-

             !       !           ! чает указанную информацию

             !       !           ! и, кроме того, делает ин-

             !       !           ! формацию по любому лока-

             !       !           ! льному символу недоступ-

             !       !           ! ной для отладчика

  TRUNCATION ! FPT   ! Запрещение! При разрешении этой функ-

             !       !           ! ции  числа одинарной точ-

             !       !           ! ности с плавающей запятой

             !       !           ! усекаются. При запрещении




                           - 108 -

                        00152-01 35 01


                                        Продолжение табл. 17

  ----------------------------------------------------------

         Формат      !Значение по!

  -------------------! умолчанию !   Выполняемая функция

    Полный   !Краткий!           !

  ----------------------------------------------------------

             !       !           ! этой функции числа одина-

             !       !           ! рной точности с плавающей

             !       !           ! запятой  округляются   на

             !       !           ! числа в форматах D, G, H;

             !       !           ! директива .ENABLE FPT ни-

             !       !           ! какого   воздействия   не

             !       !           ! оказывает; эти числа все-

             !       !           ! гда округляются



       5.4. Директивы хранения данных



       .ADDRESS - директива хранения адреса
       ------------------------------------

       По директиве .ADDRESS выполняется хранение  последова-

  тельности длинных слов, содержащей адреса в об'ектном моду-

  ле. Рекомендуется для обеспечения компоновщика дополнитель-

  ной информацией при хранении  адресов  данных  пользоваться

  директивой .ADDRESS вместо директивы .LONG.  В  разделяемых

  образах  адреса,  специфицированные  с  помощью   директивы

  .ADDRESS, порождают позиционно-независимый код.  Специфика-

  ция адресов в  позиционно-независимом  коде  обсуждается  в

  документе [1].



                           - 109 -

                        00152-01 35 01


       Формат

       .ADDRESS список адресов

       Параметр

  список адресов

       - список символов или выражений, разделенных запятыми,

         которые интерпретируются  программой  макроассемблер

         как адреса. Коэффициент повторения недопустим.

       Пример.

  LIST:  .ADDRESS   POINT, PAGE, BYTE4    ; список адресов


       .ASCIX - директива хранения строки кодов КОИ-8
       ----------------------------------------------

       Язык макроассемблер имеет  четыре  директивы  хранения

  символов кода КОИ-8:

  1) .ASCII - хранение строки кодов КОИ-8;

  2) .ASCIC - хранение пересчитанной строки кодов КОИ-8;

  3) .ASCID - хранение строки кодов КОИ-8 с описателем

              строки;

  4) .ASCIZ - хранение строки кодов КОИ-8 с завершающим

              нулем.

       За каждой директивой следует строка  символов,  заклю-

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

  ми могут быть любые печатные символы кроме пробела, символа

  табуляции, символа равенства (=), точки  с  запятой  (;)  и

  левой угловой скобки (<). Символ, используемый  в  качестве

  ограничителя не может появляться в самой строке. В качестве

  ограничителей могут употребляться алфавитно-цифровые симво-

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




                           - 110 -

                        00152-01 35 01


  алфавитно-цифровые символы.

       В строке может появляться любой символ, кроме символов

  нуля, возврата каретки и перевода формата.  Программа  мак-

  роассемблер не выполняет  преобразования  строчных  букв  в

  прописные.

       Директивы  хранения  символов  кода  КОИ-8   выполняют

  преобразование символов в  восьмиразрядные  значения  кодов

  КОИ-8 и хранение этих кодов, при этом на один символ  отво-

  дится один байт.

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

  перевода формата, может также представлен выражением,  зак-

  люченным в угловые скобки вне ограничителей.  При  этом  вы

  должны определить значения кода КОИ-8  для  символов  нуля,

  возврата каретки и перевода  формата  с  помощью  оператора

  прямого  присваивания.  Директивы  хранения  символов  кода

  КОИ-8 запоминают восьмиразрядное двоичное значение,  специ-

  фицированное данным выражением.

       Строки символов кода КОИ-8 могут продолжаться на  нес-

  колько строк текста программы, однако строка, расположенная

  на одной строке текста программы, должна быть ограничена  с

  обоих концов, причем для каждой строки символов кода  КОИ-8

  могут быть использованы различные пары ограничителей.

       Пример.

  CR=13

  LF=10

   .ASCIC ?HELLO!? <CR><LF>!MY FRIEND!

   .ASCIZ /GO BACK!/




                           - 111 -

                        00152-01 35 01


   .ASCIC @GENERAL REGISTER@

   .ASCII #HELLO,# <CR><LF>?MY FRIEND!?


       .ASCII - директива хранения строки символов
       -------------------------------------------
                          кода КОИ-8
                          ----------

       Директива .ASCII преобразует строку  символов  в  коде

  КОИ-8 в последовательность байтов. Каждый символ размещает-

  ся в одном байте.

       Формат

       .ASCII строка

       Параметр

  строка

       - ограниченная строка символов кода КОИ-8.

       Пример.

   .ASCII   /GOOD BYE!/             ; ограничитель /

   .ASCII   @UNARY OPERATORS +,-,^@ ; ограничитель @


       .ASCIC - директива хранения строки символов
       -------------------------------------------
                    Kода КОИ-8 со счетчиком
                    -----------------------

       Директива .ASCIC выполняет такую  же  функцию,  что  и

  директива .ASCII, за  исключением  того,  что  при  задании

  директивы .ASCIC перед данными (строкой символов) включает-

  ся счетный байт (счетчик). В этом счетном байте  содержится

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

  символ КОИ-8 (по одному  байту  на  символ),  расположенный

  внутри ограниченной строки, однако не  учитывается  счетный

  байт.




                           - 112 -

                        00152-01 35 01


       Директива .ASCIC оказывается полезной при  копировании

  текста, поскольку счетчик указывает на длину текста,  пред-

  назначенного для копирования.

       Формат

       .ASCIC строка

       Параметр

  строка

       - ограниченная строка символоB кода КОИ-8.

       Пример.

    CR=13                 ; определение символа CR

     .ASCIC /NUMBER/ <CR> ; эта строка кодов .ASCIC эквива-

     .BYTE  7             ; лентна комбинации: счетчик, а за

     .ASCII /NUMBER/ <CR> ; ним строка кодов .ASCII


       .ASCID - директива хранения строки символов
       -------------------------------------------
                    кода КОИ-8 с описателем
                    -----------------------

       Директива .ASCID выполняет ту же самую функцию, что  и

  директива .ASCII, за исключением того,  что  перед  данными

  (строкой символов) при задании директивы .ASCID вставляется

  описатель строки. Этот описатель строки имеет формат  изоб-

  раженный на рис.2





                           - 113 -

                        00152-01 35 01


        31                          0
         +--------------------------+
         ! информация !   длина     !
         +--------------------------+
         !         указатель        !
         +--------------------------+

  длина

       - длина строки (2 байта);

  информация

       - описательная информация (не используется)

         (2 байта);

  указатель

       - позиционно-независимый указатель на строку

         (4 байта).

                            Рис. 2

       Описатели  строк  используются  в  процедурах  вызова.

  Понятие позиционной независимости обсуждается  в  документе

  [1].

       Формат

       .ASCID строка

       Параметр

  строка

       - ограниченная строка символов кода КОИ-8.

       Пример.

  DATA_1: .ASCID /STRING_1/   ; описатель строки 1

  DATA_2: .ASCID /STRING_2/   ; описатель строки 2

  DATA_3: .ASCID /STRING_3/   ; описатель строки 3

   PUSHAL  DATA_1             ; поместить адреса

   PUSHAL  DATA_2             ; описателей в стек

   PUSHAL  DATA_3             ;



                           - 114 -

                        00152-01 35 01


   CALLS   #3, PROC           ; вызов процедуры


       .ASCIZ - директива хранения строки символов
       -------------------------------------------
                 кода КОИ-8 с завершающим нулем
                ------------------------------

       Директива .ASCIZ выполняет ту же самую функцию, что  и

  директива .ASCII, за  исключением  того,  что  при  задании

  директивы .ASCIZ в  качестве  завершающего  символа  строки

  символов добавляется нулевой байт. Таким образом, если соз-

  дан с помощью директивы .ASCIZ список текстовых  строк,  то

  для фиксации конца  строки  пользователь  должен  выполнить

  поиск только нулевых символов в последнем байте.

       Формат

       .ASCIZ строка

       Параметр

  строка

       - ограниченная строка символов кода КОИ-8.

       Пример.

   .ASCIZ  ?CONDITION         ; 9 символов в строке

                              ; данные занимают 10 байтов

   .ASCIZ  /FIRST ARGUMENT/   ; 14 символов в строке

                              ; данные занимают 15 байтов







                           - 115 -

                        00152-01 35 01



       .BYTE - директива хранения данных в виде байтов
       -----------------------------------------------


       При задании директивы .BYTE в об'ектном модуле генери-

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

       Формат

       .BYTE список выражений

       Параметр

  список выражений

       - одно или несколько выражений  разделенных  запятыми.

         Каждое выражение обрабатывается сначала как  выраже-

         ние в формате длинного слова, затем значение каждого

         выражения усекается до одного байта. Значение любого

         выражения должно лежать в диапазоне от 0 до 255  для

         данных без знака и в диапазоне от -128 до  +127  для

         данных со знаком.

       За каждым выражением  может  следовать  необязательный

  коэффициент повторения ограниченный  квадратными  скобками.

  Выражение, за которым следует коэффициент повторения  имеет

  следующий формат:

       Выражение1[выражение2]

  где выражение1 - выражение, указывающее значение, которое

                   должно быть запомнено;

      [выражение2] - коэффициент повторений, указывающий на

                     число повторений запоминаемого значения.

                     Данное выражение не должно содержать

                     каких-либо неопределенных символов и

                     должно быть абсолютным. Квадратные ско-



                           - 116 -

                        00152-01 35 01


                     бки являются обязательной частью форма-

                     та.

       Пример.

   .BYTE  <10+20>*2          ; запоминается значение 60

   .BYTE  10,64-<12*2>,^ха   ; запоминается 3 байта данных

   .BYTE  0                  ; запоминается 1 байт данных

   .BYTE  15,а+1[8+2],авс    ; запоминается 12 байтов данных

       Примечания:

       1. Если три старшыь байта выражения  в  длинном  слове

  имеют значение отличное от 0 или от ^XFFFFFF,  то  выдается

  сообщение об ошибке.

       2. Относительное выражение может приняьь во время ком-

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

  обрабатываемом об'ектном модуле компоновщик выдает диагнос-

  тическое сообщение об усечении, например:

  а:   .BYTE A    ; если виртуальный адрес предложения а ра-

                  ; вен 256 или больше, то употребление от-

                  ; носительного символа "а" приведет к

                  ; тому, что система выдаст диагностическое

                  ; сообщение об усечении

       3. Диркетива .SIGNED_BYTE является той же   директивой

  .BYTE, за исключением того,  что  выдается  диагностическое

  сообщение в том случае, если указано значение  в  диапазоне

  от 128 до 255.










                           - 117 -

                        00152-01 35 01



       .D_FLOATING(DOUBLE) - директива хранения данных
       ------------------------------------------------
                с плавающей запятой в формате D
                -------------------------------

       При задании директивы .D_FLOATING  программа  макроас-

  семблер обрабатывает указанные константы с плавающей  запя-

  той и запоминает результаты в об'ектном модуле. По директи-

  ве  .D_FLOATING  генерируется   шестидесятичетырехразрядное

  число двойной точности с плавающей  запятой  (1  разряд  на

  знак, 8 разрядов на показатель степени  и  55  разрядов  на

  дробную часть). Сведения о том, как хранятся числа  с  пла-

  вающей запятой одинарной  точности,  приведены  в  описании

  директивы .F_FLOATING.

       Форматы

       .D_FLOATING список констант

       .DOUBLE список констант

       Параметр

  список констант

       - список констант с плавающей запятой. Данные констан-

         ты не могут содержать каких-либо унарных или  бинар-

         ных операций, кроме унарного плюса и унарного  мину-

         са.

       Пример.

   .D_FLOATING     1000,1.0E3,1.0000000E-9       ; список

   .DOIBLE         3.1415928,1.107153423828      ; констант

   .D_FLOATING     5,10,15,0,0.5

       Примечания:

       1. Числа с плабающей запятой двойной  точности  всегда




                           - 118 -

                        00152-01 35 01


  округляются. На них не оказывает влияния директива  .ENABLE

  TRUNCATION.

       2. Константам с плавающей запятой, входящим  в  состав

  списка литералов не должна предшествовать операция  формата

  с плавающей запятой (^F).


       .F_FLOATING (.FLOAT) - директива хранениия данных
       -------------------------------------------------
                с плавающей запятой в формате F
                -------------------------------

       Директива .F_FLOATING выполняет обработку  констант  с

  плавающей запятой и запоминает результаты в об'ектном моду-

  ле. Директива .F_FLOATING генерирует  тридцатидвухразрядное

  данное с плавающей запятой одинарной точности (1 разряд  на

  знак, 8 разрядов на показатель  степени  и  23  разряда  на

  дробную часть ).

       Формат

       .F_FLOATING список констант

       .FLOAT список констант

       Параметр

  список констант

       - список констант с плавающей запятой. Данные констан-

         ты не должны содержать каких-либо унарных или бинар-

         ных операций, кроме унарного плюса и унарного  мину-

         са.

       Пример.

   .F_FLOATING 134.5782,74218.34E20   ; одинарная точность

   .F_FLOATING 134.2,0.1342E3,1342E-1 ; во всех случаях

                                      ; генерируется число




                           - 119 -

                        00152-01 35 01


                                      ; 134,2

   .F_FLOATING -0.75                  ;

   .FLOAT      O,25,50                ; список

   .F_FLOATING -0.75,1E38,-1.0E-37    ; данных

       Примечания:

       1. Сведения относительно выбора функции округления или

  усечения чисел с плавающей  запятой  приведены  в  описании

  директивы .ENABLE.

       2. Константам с плавающей запятой, входящим  в  состав

  списка литералов директив .F_FLOATING, не должна  предшест-

  вовать унарная операция формата с плавающей запятой (^F).


       .G_FLOATING - директива хранения данных
       ---------------------------------------
                с плавающей запятой в формате G
                -------------------------------

       Директива .G_FLOATING обрабатывает константы с плаваю-

  щей запятой и хранит результаты в об'ектном модуле.  Дирек-

  тива G_FLOATING генерирует шестидесятичетырехразрядное дан-

  ное (1 разряд на символ, 11 разрядов на показатель степени,

  52 разряда на дробную часть).

       Формат .G_FLOATING список констант

       Параметр

  список констанT

       - список констант с плавающей запятой. Данные констан-

         ты не  могут  содержать  каких-либо  операций  кроме

         унарного плюса и унарного минуса.








                           - 120 -

                        00152-01 35 01


       Пример.

   .G_FLOATING 1.75,1.0000е-6,2.0е4    ;список констант

       Примечания:

       1. Число с плавающей запятой формата G всегда ябляются

  округленными.  На  них  не  оказывает  воздействия  задание

  директивы .ENABLE TRUNCATION.

       2. Константам с плавающей запятой, входящим  в  состав

  списка литералов директивы .G_FLOATING, не должен предшест-

  вовать унарный оператор формата с плавающей запятой (^F).


       .H_FLOATING - директива хранения данных
       ---------------------------------------
                с плавающей запятой в формате H
                -------------------------------

       Директива H_FLOATING производит обработку  констант  с

  плавающей запятой в формате  H  и  сохраняет  результаты  в

  об'ектном   модуле.   Директива   .H_FLOATING    генерирует

  128-разрядное данное (1 разряд на символ,  15  разрядов  на

  показатель степени, 112 разрядов на дробную часть).

       Формат

       .H_FLOATING список констант

       Параметр

  список констанT

       - список констант с плавающей запятой. Данные констан-

         ты не  могут  содержать  каких-либо  операций  кроме

         унарного плюса и унарного минуса.

       Пример.

   .H_FLOATING 4814,3.0E16,2.00000E-4     ;список констант

       Примечания:




                           - 121 -

                        00152-01 35 01


       1. Числа с плавающей запятой формата H всегда являются

  округленными. На  них  не  оказывает  никакого  воздействия

  задание директивы .ENABLE TRUNCATION.

       2. Константа  с плавающей запятой, входящим  в  состав

  списка литералов директивы .H_FLOATING, не должен предшест-

  вовать унарный оператор формата с плавающей запятой (^F).


       .LONG - директива хранения данных в виде длинных слов
       -----------------------------------------------------


       Директива .LONG генерирует в об'ектном модуле последо-

  вательные длинные слова данных (4 байта).

       Формат

   .LONG список выражений

       Параметр

  список выражений

       - одно из нескольких выражений, разделенных  запятыми.

         За каждым выражением может следовать  необязательный

         коэффициент  повторения,  ограниченный   квадратными

         скобками.

       Выражение, за которым следует  коэффициент  повторения

  имеет следующий формат:

       Выражение1 [выражение2]

  где выражение1 - выражение, указывающее значение, предназ-

                   наченное для запоминания;

      [выражение2] - коэффициент повторений, определяющий

                     количество повторений хранимого значе-

                     ния. Данное выражение не должно содер-

                     жать каких - либо неопределенных сим-



                           - 122 -

                        00152-01 35 01


                     волов и должно быть обязательной час-

                     тью формата.

       Пример.

  DATA:   .LONG ^X4FFF,^A/MNK/ ; 2 длинных слова данных

          .LONG 1@2            ; 100 (двоичное) хранится

                               ; как длинное слово

          .LONG 1[64]          ; 64 данных в виде длинных

                               ; слов, каждое из которых

                               ; хранит 1

       Примечание. Каждое выражение  в  списке  должно  иметь

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


       .OCTA - директива хранения данных в виде октаслов
       -------------------------------------------------

       Директива .OCTA  генерирует  128  разрядов  (16  байт)

  двоичных данных.

       Формат

       .OCTA литерал


       .OCTA символ

       Параметры

  литерал

       - любая постоянная величина. Этой величине могут пред-

         шествовать операторы ^O,^B,^X или ^D  для  указания,

         соответственно,      восьмеричного,       двоичного,

         шестнадцатEричного или десятичного основания счисле-

         ния. Кроме того, данной величине  может  предшество-

         вать  оператор  ^A,  специфицирующий  текст  в  коде

         КОИ-8. В качестве основания по умолчанию принимается



                           - 123 -

                        00152-01 35 01


         десятичное основание счисления.

  Символ

       - символ, определенный в каком-либо  месте  программы.

         Этот символ представляется в виде 32-разрядного зна-

         чения с распространением знака, которое  хранится  в

         октаслове.

       Пример.

   .OCTA  ^A/ARG=3.1415926/     ; каждый символ КОИ-8

                                ; хранится в байте

   .OCTA  ^B101010101010        ; двоичное число хранится

                                ; в октаслове

   .OCTA  ^X7FFFFF              ; шестнадцатеричное число

                                ; хранится в октаслове

       Примечание. Директива .OCTA похожа на директиву  .QUAD

  и отлична от остальных  директив  хранения  данных  (.BYTE,

  .WORD, .LONG) TEM, что воспринимает только одно значение  и

  не обрабатывает выражения.


       .PACKED - директива хранения в упакованном формате
       --------------------------------------------------
                 данных в виде десятичных строк
                 ------------------------------

       Директива .PACKED  генерирует  упакованные  десятичные

  данные, где две цифры  занимают  один  байт.  Представление

  десятичных чисел в упакованном формате  в  виде  десятичных

  строк полезно при вычислениях, в которых требуется  высокая

  точность. Данные этого  типа  обрабатываются  инструкциями,

  выполняющими операции над десятичными числами в упакованном

  формате.




                           - 124 -

                        00152-01 35 01


       Формат

       .PACKED десятичное число [,символ]

       Параметры

  десятичное число

       - десятичное число с количеством цифр от  0  до  31  с

         необязательным знаком. Kаждая цифра может иметь зна-

         чение в диапазоне от 0 до 9.

  [,символ]

       - необязательный символ, которому присваивается значе-

         ние, равное количеству десятичных цифр в строке, при

         этом знак не считается в качестве цифры.

       Пример.

   .PACKED 657,AB        ; символ AB имеет значение 3

   .PACKED -2456,DF      ; символ DF имеет значение 4

   .PACKED 325

   .PACKED +4160


       .QUAD - директива хранения данных в виде квадрослов
       ---------------------------------------------------


       Директива .QUAD генерирует двоичное данное размером  в

  64 разряда (8 байт).


       Формат

       .QUAD литерал

       .QUAD символ

       Параметры

  символ

       - символ, определенный в произвольном месте программы.




                           - 125 -

                        00152-01 35 01


         перед запоминанием в  квадрослове  значение  данного

         символа представляется в виде 32-разрядной  величины

         с распространенным знаком.

  Литерал

       - любое постоянное значение.  Данному  значению  может

         предшествовать оператор ^O,^B,^X,^D, который  указы-

         вает  на,  соответственно,  восьмеричное,  двоичное,

         шестнадцатеричное и десятичное основание  счисления.

         Кроме того, данному  значению  может  предшествовать

         оператор ^а, указывающая на текст в коде КОИ-8.

       Пример.

   .QUAD  ^A!NOVEMBER!        ; данное занимает 8 байтов

   .QUAD  ^XA9FFFF            ; шестнадцатеричное число

                              ; хранится в квадрослове

   .QUAD  ^B11111000001       ; двоичное число хранится

                              ; в квадрослове

   .QUAD  ^О44444             ; восьмеричное число

                              ; хранится в квадрослове

   .QUAD  APRIL               ; APRIL имеет 32 разрядное

                              ; значение с

                              ; распространением нуля

       Примечание. Директива .QUAD похожа на директиву  .OCTA

  и отличается от других  директив  хранения  данных  (.BYTE,

  .WORD, .LONG) тем, что  она  не  обрабатывает  выражения  и

  воспринимает только одно значение. Эта директива не воспри-

  нимает список значений.






                           - 126 -

                        00152-01 35 01



       .SIGNED_BYTE - директива хранения данных со знаком
       --------------------------------------------------
                         в виде байтов
                         -------------

       Директива .SIGNED_BYTE эквивалентна директиве .BYTE за

  исключением того, что она особо указывает на наличие  знака

  у данных. Компоновщик использует данную информацию для про-

  верки на условие переполнения.

       Формат

       .SIGNED_BYTE список выражений

       Параметр

  список выражений

       - выражение или список выражений, разделенных  запяты-

         ми. За каждым  из  этих  выражений  может  следовать

         коэффициент  повторения,  заключенный  в  квадратные

         скобки ([ ]).

       Выражение, за которым следует  коэффициент  повторений

  имеет следующий формат:

       Выражение1[выражение2]

  где выражение1 - выражение, указывающее на значение, кото-

                   рое должно быть запомнено. Это значение

                   должно лежать в диапазоне от -128 до +127

      [выражение2] - коэффициент повторений, указывающий,

                     сколько раз должно быть повторено спе-

                     цифицированное значение. Данное выраже-

                     ние не должно содержать никаких неопре-

                     деленных символов и должно быть абсо-

                     лютным. Квадратные скобки являются обя-




                           - 127 -

                        00152-01 35 01


                     зательным элементом формата.

       Пример.

   .SIGNED_BYTE   ALPHA-DELTA     ; данные

   .SIGNED_BYTE   BETA[2*6]       ; хранятся

   .SIGNED_BYTE   SIN,COS[4]      ; в виде байтов

       Примечание. Использование директивы .SIGNED_BYTE  поз-

  воляет компоновщику выявлять  условия  переполнения,  когда

  значение выражения находится в диапазоне  от  128  до  255.

  Значения без знака из указанного диапазона могут  храниться

  в байтах, а значения со знаком - нет.


       .SIGNED_WORD - директива хранения данных со
       -------------------------------------------
                      знаком в виде слов
                      ------------------

       Директива .SIGNED_WORD эквивалентна  директиве  .WORD,

  за исключением того, что она указывает на наличие  знака  у

  данных, хранящихся в об'ектном модуле. Компоновщик  исполь-

  зует данную информацию для проверки наличия  условий  пере-

  полнения. Директива .SIGNED_WORD оказывается полезной после

  инструкции выбора (CASE), при этом гарантируется, что  сме-

  щение помещается в слове.

       Формат

       .SIGNED_WORD список выражений

       Параметр

  список выражений

       - выражение или список выражений, разделенных  запяты-

         ми. За каждым из выражений может следовать  необяза-

         тельный коэффициент повторений, заключенный в  квад-




                           - 128 -

                        00152-01 35 01


         ратные скобки.


       Выражение, за которым следует коэффициент  повторений,

  имеет следующий формат:

       Выражение1[выражение2]

  где выражение1 - выражение, указывающее значение, которое

                   должно быть запомнено. Данное значение

                   должно находится в диапазоне от -32768

                   до +32767;

      [выражение2] - коэффициент повторений, указывающий,

                     сколько раз будет повторено специфици-

                     рованное значение. Данное выражение не

                     должно содержать никаких неопределен-

                     ных символов и должно быть абсолютным.

       Пример.

   .SIGNED_WORD   LOC2-LOC1        ; данные хранятся

   .SIGNED_WORD   SORT[20]         ; в виде слов

       Примечание. Использование директивы .SIGNED_WORD  поз-

  воляет компоновщику выявлять  условия  переполнения,  когда

  значение выражения лежит в диапAзоне  от  32768  до  65535.

  Значения без знака из этого  диапAзона  могут  храниться  в

  словах, а значения со знаком - нет.


       .WORD - директива хранения данных в виде слов
       ---------------------------------------------

       Директива .WORD генерирует последовательные  слова  (2

  байта) данных в об'ектном модуле.

       Формат





                           - 129 -

                        00152-01 35 01


       .WORD список выражений

       Параметр

  список выражений

       - одно или несколько выражений, разделенных  запятыми.

         За каждым из выражений может следовать  необязатель-

         ный коэффициент повторения, заключенный в квадратные

         скобки.

       Выражение, за которым следует коэффициент  повторения,

  имеет следующий формат:

       Выражение1[выражение2]

  где выражение1 - выражение, указывающее на значение, кото-

                   рое должно быть запомнено;

      [выражение2] - выражение, определяющее число раз, ко-

                     торое указанное значение будет запомина-

                     ться. Данное выражение не должно содер-

                     жать никаких неопределенных символов и

                     должно быть абсолютным.

                     Квадратные скобки являются обязательным

                     элементом формата.

       Пример.

       .WORD ^X3FF,SORT[3],ASIA,25

       Примечания:

       1. Выражение обрабатывается сначала как длинное слово,

  а затем  усекается  до  слова.  Значение  выражения  должно

  лежать в диапAзоне значений от -32768 до +32767 для  данных

  со знаком и в диапазоне от 0 до 65535 для данных без знака.

  Если два  старших  байта  длинного  слова  имеют  значение,




                           - 130 -

                        00152-01 35 01


  отличное от 0 и ^XFFFF, выводится сообщение об ошибке.

       2. Директива   .SIGNED_WORD   эквивалентна   директиве

  .WORD, за исключением того, что в случае использования этой

  директивы выводится диагностическое сообщение, если  значе-

  ние выражения лежит в диапазоне от 32768 до 65535.



       5.5. Директивы управления счетчиком адресов



       .ALIGN - директива настройки счетчика адресов
       ---------------------------------------------

       Директива .ALIGN позволяет настроить счетчик  инструк-

  ций на определенную границу, указанную либо  целым  числом,

  либо ключевым словом.

       Форматы

       .ALIGN целое[,выражение]

       .ALIGN ключ[,выражение]

       Параметры

  Целое

       - целое число в диапазоне от 0 до 9.  Счетчик  адресов

         программы настраивается на адрес, который равен зна-

         чению числа два в степени данного целого числа.

  Ключ

       - одно из  пяти  ключевых  слов,  указывающих  границу

         настройки. При этом счетчик адресов программы  наст-

         раивается на адрес, следующий за текущим  адресом  и

         кратный соответствующему значению из перечисленных в

         табл. 18.





                           - 131 -

                        00152-01 35 01


                                              Таблица 18

       -------------------------------------------------

            Ключевое слово   !       Размер (в байтах)

       -------------------------------------------------

            BYTE             !       2^0 = 1

            WORD             !       2^1 = 2

            LONG             !       2^2 = 4

            QUAD             !       2^3 = 8

            PAGE             !       2^9 = 512

  Выражение

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

         Данное выражение не должно содержать никаких неопре-

         деленных символов и должно быть абсолютным.

       Пример.

   .ALIGN BYTE,1         ; Настроить на байт, заполнить 1

   .ALIGN LONG, 0        ; Настроить на границу длинного

                         ; слова, заполнить нулями

   .ALIGN 2,^A/ /        ; Настроить на границу длинного

                         ; слова, заполнить пробелами

   .ALIGN PAGE           ; Настроить на границу страницы

       Примечания:

       1. Настройка адреса на определенную границу с  помощью

  директивы .ALIGN имеет более низкий приоритет по  сравнению

  с настройкой программной  секции,  в  которой  производится

  попытка данной настройки. Например, если действует настрой-

  ка программной секции  (BYTE)  по  умолчанию,  а  директива

  .ALIGN издана с аргументом WORD или  с  другим  аргументом,




                           - 132 -

                        00152-01 35 01


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

       2. Если указано необязательное  выражение,  то  байты,

  которые пропускает счетчик адресов  программы  (если  такие

  есть), заполняются значением этого выражения.

       3. Хотя большинство инструкций не  требует  какой-либо

  настройки, кроме настройки адреса  на  границу  байта,  при

  настройках,  описанных  в  табл.  19,  повышается  скорость

  выполнения.

                                                   Таблица 19

  -----------------------------------------------------------

       Длина данных       !        Настройка

  -----------------------------------------------------------

       Слово              !        На слово

       Длинное слово      !        На длинное слово

       Квадрослово        !        На квадрослово


       .BLKX - директивы резервирования блоков памяти
       ----------------------------------------------

       В языке макроассемблер имеется десять директив  резер-

  вирования блоков памяти:

  1) .BLKA-резервирует память для адресов (длинные слова);

  2) .BLKB-резервирует память для данных в байтах;

  3) .BLKD-резервирует память для данных двойной точности

           с плавающей запятой (квадрослова);

  4) .BLKF-резервирует память для данных одинарной точности

           с плавающей запятой (длинные слова);

  5) .BLKG-резервирует память для данных формата G

          (квадрослова);




                           - 133 -

                        00152-01 35 01


  6) .BLKH-резервирует память для данных формата H

          (октаслова);

  7) .BLKL-резервирует память для данных в длинных словах;

  8) .BLKO-резервирует память для данных в октасловах;

  9) .BLKQ-резервирует память для данных в квадрословах;

  10).BLKW-резервирует память для данных в словах.

       Каждая из директив резервирует память для данных  раз-

  личных типов. Значение выражения определяет количество эле-

  ментов данных, для которых программа макроассемблер  резер-

  вирует память.  Например,  директива  .BLKL  4  резервирует

  память для данных в об'еме четырех длинных слов, а директи-

  ва .BLKB 2 резервирует память для данных в об'еме двух бай-

  тов.

       Общее количество зарезервированных байтов равно  длине

  элементов данных данного типа, умноженной на значение выра-

  жения. Количество зарезервированных байтов в соответствии с

  директивой определяется следующим образом:

   .BLKB               значение выражения

   .BLKW               2 х (значение выражения)

   .BLKA

   .BLKF               4 х (значение выражения)

   .BLKL

   .BLKD               8 х (значение выражения)

   .BLKG

   .BLKQ

   .BLKH               16 х (значение выражения)

   .BLKO




                           - 134 -

                        00152-01 35 01


       Форматы

          .BLKA выражение

          .BLKB выражение

          .BLKD выражение

          .BLKF выражение

          .BLKG выражение

          .BLKH выражение

          .BLKL выражение

          .BLKO выражение

          .BLKQ выражение

          .BLKW выражение

       Параметр

  выражение

       - выражение,  определяющее  об'ем  памяти,  подлежащий

         резервированию. Все символы в этом выражении  должны

         быть определены, а само выражение должно быть  абсо-

         лютным. Если выражение опущено, принимается значение

         по умолчанию равное 1.

       Пример.

   .BLKB  25       ; облать для 25 байтов

   .BLKW  10       ; область для 10 слов (20 байтов)

   .BLKL  10       ; область для 10 длинных слов (40 байтов)

   .BLKO  2        ; область для 2 октаслов (32 байта)

   .BLKF  <3*2>    ; область для 6 значений в формате

                   ; с плавающей запятой (24 байта)








                           - 135 -

                        00152-01 35 01



       .END - директива завершения трансляции
       --------------------------------------

       Директивой  .END  завершается  исходная  программа.  В

  текущем исходном файле или в любых  дополнительных  файлах,

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

  за точкой программы, в которой задана  директива  .END,  не

  должно появляться  никакого  дополнительного  текста.  Если

  такой дополнительный текст существует,  то  программа  мак-

  роассемблер его игнорирует. Этот  дополнительный  текст  не

  появится ни в файле листинга, ни в файле об'ектного модуля.

       Формат

       .END [имя]

       Параметр

  имя

       - адрес (называемый адресом  передачи  управления),  с

         которого начинается выполнение программы.

       Пример.

   .ENTRY          BEGIN,0           ; маска входа

     .                               ; основная программа

     .

     .

   .END            BEGIN

       Примечания:


       1. Адрес передачи управления должен находиться в такой

  программной секции, которая имеет атрибут EXE.

       2. Когда компонуется выполняемый образ,  состоящий  из

  нескольких об'ектных модулей, только один об'ектный  модуль



                           - 136 -

                        00152-01 35 01


  должен завершаться директивой .END, в которой указан  адрес

  передачи управления. Все остальные об'ектные модули  должны

  завершаться директивой .END, в которой не указывается адрес

  передачи управления. Если выполняемый образ либо не  содер-

  жит ни одного адреса  передачи  управления,  либо  содержит

  более одного адреса  передачи  управления,  то  компоновщик

  выдает сообщение об ошибке.

       3. Если в момент указания директивы  .END  в  исходной

  программе содержится незавершенный блок  условной  трансля-

  ции, то выдается сообщение об ошибке.


       .EVEN - директива установки четности текущего
       ---------------------------------------------
                   счетчика адресов программы
                   --------------------------

       Задание директивы .EVEN обеспечивает установку четнос-

  ти значения текущего счетчика адресов программы. Это выпол-

  няется путем добавления к значению счетчика  адресов  прог-

  раммы единицы, если это  значение  нечетно.  Если  значение

  текущего счетчика адресов является уже четным,  то  никаких

  действий не выполняется.

       Формат

   .EVЕN








                           - 137 -

                        00152-01 35 01



       .ODD - директива установки нечетности текущего
       -----------------------------------------------
                   счетчика адресов прграммы
                   -------------------------

       Задание директивы .ODD обеспечивает  установку  нечет-

  ности значения текущего  счетчика  адресов  программы.  Это

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

  счетчика адресов программы, если это значение  четно.  Если

  значение счетчика адресов программы уже является  нечетным,

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

       Формат

       .ODD



       5.6. Директивы секционирования программ



       .PSECT - директива секционирования программы
       --------------------------------------------

       С помощью директивы .PSECT осуществляется  определение

  программной секции и ее атрибутов, а также происходит ссыл-

  ка к программной секции, один раз уже определенной. Разбие-

  ние программы на программные секции может  иметь  следующие

  цели:

       - разработка модульных программ;

       - отделение инструкций от данных;

       - предоставление возможности различным  модулям  иметь

         доступ к одним и тем же данным;

       - защита данных, предназначенных только для чтения,  и

         инструкций от модификации;

       - идентификация секций об'ектного модуля для  отладчи-



                           - 138 -

                        00152-01 35 01


         ка;

       - управление порядком, в  котором  программные  секции

         запоминаются в виртуальной памяти.


       Программа макроассемблер автоматически определяет  две

  программные секции:

       1) абсолютную программную секцию;

       2) неименованную (именем является пробел)  программную

  секцию.

       Любые определения символов, появляющиеся  в  программе

  до инструкций, данных или директивы  .PSECT,  помещаются  в

  абсолютную программную секцию.  Все  инструкции  и  данные,

  которые появляются до того, как определена первая  поимено-

  ванная  программная  секция,  размещаются  в  неименованной

  программной секции. Любая директива .PSECT,  не  содержащая

  спецификации имени программной секции, относится к неимено-

  ванной программной секции.

       Пользователь может определить максимум 254 поименован-

  ных программных секций.

       Когда программа макроассемблер обрабатывает  директиву

  .PSECT, в которой указана спецификация нового  имени  прог-

  раммной секции, она  создает  новую  программную  секцию  и

  запоминает имя, атрибуты и группировку  данной  программной

  секции. Программа  макроассемблер  включает  все  данные  и

  инструкции, которые следуют за  директивой  .PSECT,  в  эту

  программную секцию, до тех пор пока  не  встретится  другая

  директива .PSECT. Все программные секции, являющиеся  пере-

  мещаемыми, начинаются со значения счетчика адресов програм-



                           - 139 -

                        00152-01 35 01


  мы равного нулю.

       Если  программа  макроассемблер  встречает   директиву

  .PSECT со спецификацией имени ранее определенной  программ-

  ной секции, она запоминает новые данные или инструкции пос-

  ле последней записи в ранее определенной  программной  сек-

  ции. При этом счетчик адресов программы устанавливается  на

  значение, которое имел счетчик адресов  программы  в  конце

  ранее определенной программной секции. Программисту  необя-

  зательно перечислять атрибуты  программной  секции  при  ее

  продолжении, однако любой перечисленный атрибут должен быть

  тем же самым, который действовал в данной программной  сек-

  ции раньше. Продолжение программной секции не может  содер-

  жать атрибуты, не согласующиеся с атрибутами, указанными  в

  исходной директиве .PSECT.

       Атрибуты,  перечисленные  в   спецификации   директивы

  .PSECT, обеспечивают только описание содержимого  программ-

  ной секции. На самом деле, программа макроассемблер не про-

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

  включает перечисленные атрибуты. Однако  и  программа  мак-

  роассемблер и программа компоновщик проверяют, все ли прог-

  раммные секции с одинаковыми именами имеют в точности  одни

  и те же атрибуты. Как программа макроассемблер, так и прог-

  рамма компоновщик выводят сообщения об ошибке, если атрибу-

  ты программных секций не согласуются.

       Имена программных секций являются независимыми  симво-

  лами по отношению к локальным символам, глобальным символам

  и именам макрокоманд. Таким образом, одно и тоже сиволичес-




                           - 140 -

                        00152-01 35 01


  кое имя может употребляться для обозначения локального сим-

  вола или имени макрокоманды.

       Формат

       .PSECT


       .PSECT [имя,[список аргументов]]

       Параметры

  имя

       - имя программной секции. В  состав  указанного  имени

         может    входить    до     31     символа,     любой

         алфавитно-цифровой символ, символ подчеркивания (_),

         символ денежной единицы ($) и точка  (.).  При  этом

         первый символ не может быть цифрой.

  Список аргументов

       - список, содержащий  атрибуты  программной  секции  и

         информацию  о  расположении  программной  секции.  В

         табл. 20 перечислены атрибуты программной  секции  и

         приведены их функции. В табл. 21 приведены  сведения

         об атрибутах программной секции (и их взаимоисключа-

         щих  противоположностях),  принятых  по   умолчанию.

         Программные  секции  настраиваются  на  определенную

         границу, если указано целое число в диапазоне  от  0

         до 9 или одно из пяти ключевых  слов.  Если  указано

         целое число, то программная секция компонуется таким

         образом, чтобы начинаться со следующего виртуального

         адреса, равного числу, которое кратно  числу  два  в

         степени данного целого числа. Если указано  ключевое

         слово, то программная секция компонуется таким обра-



                           - 141 -

                        00152-01 35 01


         зом, чтобы  начинаться  со  следующего  виртуального

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

         22. Ключевым словом по умолчанию является BYTE.

       Пример.

   .PSECT  INSTR,EXE,LONG    ; секция INSTR содержит только

                             ; инструкции

   .PSECT  DATA,NOEXE,WORD   ; секция DATA содержит только

                             ; данные

                                                  Таблица 20

                  Атрибуты программной секции

  ----------------------------------------------------------

  Имя  !                 Функция

  атри-!

  бута !

  ----------------------------------------------------------

  ABS  ! Признак абсолютной программной секции (неперемещае-

       ! мой).  Компоновщик  присваивает  данной программной

       ! секции абсолютный адрес. Программная секция с таким

       ! атрибутом может содержать лишь определения символов

       ! (обычно определения  символических смещений относи-

       ! тельно  структур  данных,  которые  используются  в

       ! транслируемых  программах).  Абсолютная программная

       ! секция  не  вносит в образ никакого двоичного кода,

       ! так что  ее требование к размещению в байтах, пере-

       ! даваемое компоновщику, имеет значение, равное нулю.

       ! размер  определяемой структуры данных равен размеру

       ! абсолютной  программной  секции,  напечатанному   в




                           - 142 -

                        00152-01 35 01


                                        Продолжение табл. 20

  ----------------------------------------------------------

  Имя  !                 Функция

  атри-!

  бута !

  ----------------------------------------------------------

       ! "краткой  сводке  по  программной  секции"  в конце

       ! листинга.  Сравните  данный  атрибут с его противо-

       ! положностью, с атрибутом REL

  CON  ! Признак конкатенации. Программные секции с одинако-

       ! вым именем и с одними и теми же атрибутами (включая

       ! атрибут  CON)  сливаются в одну программную секцию.

       ! Содержимое этих программных секций сливается в  по-

       ! рядке,   в  котором  их  обрабатывает   компоновщик

       ! размещенное  пространство виртуальных адресов равно

       ! сумме индивидуальных запросов на размещение

  EXE  ! Признак  выполняемости.  Данная  программная секция

       ! содержит  инструкции.  Атрибут  EXE  является сред-

       ! ством  отделения  инстукций  от  данных, предназна-

       ! ченных только для чтения или для чтения и записи

  GBL  ! Признак глобальной  программной секции. Программные

       ! секции, имеющие одинаковые наименования и одни и те

       ! же  атрибуты,  включая  атрибуты  GLB  и OVR, будут

       ! иметь одни и те же перемещаемые адреса в памяти, да

       ! же  когда программные секции расположены в различны

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

       ! секций  с  фортрановскими  блоками  COMMON. Сравнит




                           - 143 -

                        00152-01 35 01


                                        Продолжение табл. 20

  ----------------------------------------------------------

  Имя  !                 Функция

  атри-!

  бута !

  ----------------------------------------------------------

       ! данный атрибут с его противоположностью, с атрибуто

       ! LCL

  LCL  ! Признак  локальной  программной  секции. Программна

       ! секция  ограничена  ее  группой. Сравните данный ат

       ! рибут  с  его  противоположностью,  с  атрибутом GL

  LIB  ! Признак  библиотечного  сегмента.  Резервируется дл

       ! будущего использования

  NOEXE! Признак невыполняемости. Программная секция содержи

       ! только данные и не содержит инструкций

  NOPIC! Признак позиционной зависимости содержимого програм

       ! мной секции. Данная программная секция предназначен

       ! для фиксированного размещения в  виртуальной  памят

       ! (когда это происходит в разделяемом образе)

  NORD ! Признак нечитаемости. Резервируется для  дальнейшег
        
       ! использования

  NOSHR! Признак  запрета  разделяемости.  Программная секци

       ! резервируется для частого использования инициирующи

       ! процессом во время выполнения

  NOWRT! Признак  запрета записи. Содержимое программной сек

       ! ции не может быть изменено во время выполнения

  OVR  ! Признак перекрытия. Программные секции с  одинаковы




                           - 144 -

                        00152-01 35 01


                                        Продолжение табл. 20

  ----------------------------------------------------------

  Имя  !                 Функция

  атри-!

  бута !

  ----------------------------------------------------------

       ! именем  и с одними и теми же атрибутами, включая ат

       ! рибут OVR, имеют в памяти один и тот же  относитель

       ! ный базовый адрес. Размещенное  пространство  вирту

       ! альных адресов равно размещению, затребованному наи

       ! большей из перекрывающихся программных секций. Срав

       ! ните данный атрибут с его противоположностью, с  ат

       ! рибутом CON

  PIC  ! Признак позиционной независимости содержимого  прог

       ! мной секции. Данная программная секция допускает пе

       ! ремещение, то есть ей может  быть  назначена  друга

       ! область памяти (когда это  происходит в  разделяемо

       ! образе)

  RD   ! Признак  читаемости.  Резервируется  для дальнейшег

       ! использования

  REL  ! Признак перемещаемой программной секции. Компоновщи

       ! назначает данной  программной  секции  относительны

       ! базовый адрес. Программная  секция  может  содержат

       ! инструкции или данные. Сравните с атрибутом ABS

  SHR  ! Признак разделяемости программной секции.  Программ

       ! ная секция допускает  разделение  между  нескольким

       ! процессами  во время выполнения. Данный атрибут наз




                           - 145 -

                        00152-01 35 01


                                        Продолжение табл. 20

  ----------------------------------------------------------

  Имя  !                 Функция

  атри-!

  бута !

  ----------------------------------------------------------

       ! начается программным  секциям,  которые  могут  быт

       ! скомпонованы в разделяемый образ

  USR  ! Признак  пользовательского  сегмента.  Резервируетс

       ! для дальнейшего использования

  VEC  ! Признак содержания вектора. Программная  секция  со

       ! держит вектор изменения режима, который указывает н

       ! привилегированный  разделяемый  образ.  Атрибут  SH

       ! должен использоваться с атрибутом VEC

  WRT  ! Признак записи.  Содержимое  программной  секции  в

       ! время выполнения может быть изменено

                                                Таблица 21

           Атрибуты программной секции по умолчанию

    ------------------------------------------------------

       Атрибут по умолчанию ! Противоположный атрибут

    ------------------------------------------------------

                CON         !           OVR

                EXE         !           NOEXE

                LCL         !           GLB

                NOPIC       !           PIC

                NOSHR       !           SHR

                RD          !           NORD




                           - 146 -

                        00152-01 35 01


                                      Продолжение табл. 21

    ------------------------------------------------------

       Атрибут по умолчанию ! Противоположный атрибут

    ------------------------------------------------------

                REL         !           ABS

                WRT         !           NOWRT

                NOVEC       !           VEC

                                                  Таблица 22

   ---------------------------------------------------------

        Ключевое слово    !      Размер (в байтах)

   ---------------------------------------------------------

        BYTE              !      2^0 = 1

        WORD              !      2^0 = 2

        LONG              !      2^0 = 4

        QUAD              !      2^0 = 8

        PAGE              !      2^0 = 512

       Пример.

   .PSECT     INSTR,EXE,LONG      ; секция INSTR содержит

                                  ; только инструкции

   .PSECT     DATA,NOEXE,WORD     ; секция DATA содержит

                                  ; только данные

       Примечания:

       1. Директива .ALIGN не может указать размер  настройки

  адреса больший, чем размер текущей программной секции, сле-

  довательно в директиве .PSECT  следует  указать  наибольший

  размер настройки адреса, необходимый в  данной  программной

  секции. Для повышения  эффективности  выполнения  для  всех




                           - 147 -

                        00152-01 35 01


  программных секций, содержащих данные в виде длинных  слов,

  рекомендуется и настройка на длинное слово или  на  больший

  размер.


       2. В табл. 23 приведены атрибуты, принятые по  умолча-

  нию, в абсолютных и неименованных программных секциях. Сле-

  дует заметить, что имена данных программных секций содержат

  точки и пробелы.

                                                   Таблица 23

  -----------------------------------------------------------

   Имя        !              

   программной!        Перечень атрибутов

   секции     !

  -----------------------------------------------------------

    . ABS .   ! NOPIC,USR,CON,ABS,LCL,NOSHR,NOEXE,NORD,NOWRT,

              ! NOVEC,вYTE

    . BLANK . ! NOPIC,USR,CON,REL,LCL,NOSHR,NOEXE,RD,WRT,

              ! NOVEC,BYTE


       .RESTORE_PSECT - директива восстановления
       ------------------------------------------
                       программной секции
                       ------------------

       Директива .RESTORE_PSECT  восстанавливает  программную

  секцию из вершины стека контекста программной секции,  если

  она была сохранена с  помощью  директивы  SAVE_PSECT.  Этот

  стек является внутренним стеком  программы  макроассемблер.

  Если данный стек оказывается пустым, когда задается  дирек-

  тива .RESTORE_PSECT, то выводится сообщение об ошибке.  При

  восстановлении    программной    секции    по     директиве



                           - 148 -

                        00152-01 35 01


  .RESTORE_PSECT значение текущего счетчика адресов программы

  восстанавливается до значения, при котором данная программ-

  ная секция была  сохранена.  Восстанавливается  также  блок

  локальных меток, если он был сохранен при сохранении  прог-

  раммной секции.

       Формат

       .RESTORE_PSECT

       Пример.


          .MACRO  DEF_SYMB        ; определение символов

                                  ; и областей

          .SAVE_PSECT             ; сохранение текущей

                                  ; секции

          .PSECT MACR1,NOWRT,WORD ; определить секцию

                                  ; MACR1

  A=17

  B=13

  C=11

          .PSECT MACR2,NOEXE,WORD ; определить секцию

                                  ; MACR2

          .BLKW  200

          .BLKB  100

          .RESTORE_PSECT          ; восстановить

                                  ; программную

                                  ; секцию

          .ENDM







                           - 149 -

                        00152-01 35 01


       Директивы .RESTORE_PSECT и SAVE_PSECT особенно полезны

  в макрокомандах, в которых вводится определение программных

  секций. В приведенном макроопределении сохраняется контекст

  текущей программной секции  и  вводится  определение  новой

  программной секции. Затем вновь воостанавливается сохранен-

  ная программная секция. Если бы макрокоманда не сохраняла и

  не восстанавливала контекст программной секции каждый  раз,

  когда данная макрокоманда вызывается, то данная программная

  секция изменилась бы.

       Примечание.    Альтернативной     формой     директивы

  .RESTORE_PSECT является директива .RESTORE.


       .SAVE_PSECT - директива сохранения программной секции
       ------------------------------------------------------

       Директива .SAVE_RSECT сохраняет контекст текущей прог-

  раммной секции в вершине стека контекста  программной  сек-

  ции, когда осуществляется выход из контекста текущей  прог-

  раммной секции.  Данный  стек  является  внутренним  стеком

  программы макроассемблер. Стек контекста программной секции

  может содержать до 31 записи. Каждая запись в  стеке  вклю-

  чает в себя значение текущего счетчика адресов программы, а

  также максимальное значение, присвоенное счетчику в текущей

  программной секции. Если стек оказывается заполненым, когда

  встречается директива .SAVE_PSECT, возникает ошибка.

       Директивы  .SAVE_PSECт  и  .RESTоRE_PSECT  оказываются

  особенно полезными  в  макрокомандах,  в  которых  вводятся

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

  директивы  .SAVE_PSECT  приведен   в   описании   директивы




                           - 150 -

                        00152-01 35 01


  .RESTORE_PSECT.

       Формат

       .SAVE_PSECT [LOCAL_BLOCK]

       Параметр

  [LOCAL_BLOCK]

       - необязательное ключевое слово, которое указывает  на

         то, что вместе с контекстом программной секции  дол-

         жен быть сохранен и текущий блок локальных меток.

       Пример.

  MACRO:

          .MACRO ERROR_MES,NEW_TEXT   ; Формирование таблицы

                                      ; указателей и

                                      ; сообщений об ошибках

          .IIF    NOT_DEFINED  MES_NUMBER  MES_NUMBER=0

          .SAVE_PSECT     LOCAL_BLOCK ; Сохранить блок

                                      ; локальных меток

          .PSECT  TEXT                ; Таблица сообщений

                                      ; об ошибках

  MES::    ASCIZ  /NEW_TEXT/

          .PSECT  POINTER             ; Таблица указателей

          .ADRESS MES

          .RESTORE_PSECT              ; Восстановить блок

                                      ; локальных меток

          PUSHL   #MES_NUMBER

                  #1,PRINT_MES        ; Печать сообщения об

                                      ; ошибке

  MES_NUMBER=MES_NUMBER+1




                           - 151 -

                        00152-01 35 01


          .ENDM   ERROR_MES

          INCL    R4

          CLRL    R2

          BLBC    R1,4$

          ERROR_MES <SYMBOL NOT FOUND> ; Ввести в таблицу

                              ; сообщение "символ не найден"

  4$:     RSB




       Использование в данном примере  директивы  .SAVE_PSECT

  LOCAL_BLOCK означает, что локальная метка 4$  определена  в

  том же самом блоке локальных меток, в  котором  выполняется

  ссылка к 4$. Если локальная метка  не  определена  в  блоке

  локальных меток,в котором к  ней  производится  ссылка,  то

  выводится сообщение об ошибке следующего вида:

       %MACRO-E-UNDEFSYM, UNDEFINED SUMBOL

       Примечание.    Альтернативной     формой     директивы

  .SAVE_PSECT является директива .SAVE.



       5.7. Директивы управления символами



       .DEBUG - директива об'явления символа отладки
       ---------------------------------------------

       Директива .DEBUG определяет список  символов,  исполь-

  зуемых символическим отладчиком. Во время процесса интерак-

  тивной отладки эти символы могут использоваться для  ссылки

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

  этим символам.




                           - 152 -

                        00152-01 35 01


       Формат

       .DEBUG список символов

       Параметр

  список символов

       - список разрешенных символических  имен,  разделенных

         запятыми.

       Пример.

   .DEBUG  PTR1,PTR2,DELTA   ; эти символы известны

                             ; отладчику

       Примечание. Программа макроассемблер добавляет  симво-

  лы, указанные в списке символов, в таблицу символов данного

  об'ектного модуля. В директиве .DEBUG пользователю не нужно

  указывать глобальные символы, поскольку глобальные  символы

  автоматически  помещаются  в  таблицу  символов  об'ектного

  модуля.


       .EXTERNAL - директива об'явления внешнего символа
       -------------------------------------------------

       Задание директивы .EXTERNAL указывает на то, что опре-

  деленные символы являются внешними  или,  другими  словами,

  данные символы определены в другом об'ектном  модуле  и  не

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

       Формат

       .EXTERNAL список символов

       Параметр

  список символов

       - список допустимых символов, разделенных запятыми.

       Пример.




                           - 153 -

                        00152-01 35 01


   .EXTERNAL AB,CD,EF    ; внешние символы

       Примечания:

       1. Если директивой .ENABLE разрешен  аргумент  GLOBAL,

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

  внешние. Таким образом, если разрешен  аргумент  GLOBAL,  у

  программиста   нет   необходимости    задавать    директиву

  .EXTERNAL. Однако если аргумент GLOBAL запрещен,  то  прог-

  раммист обязан  явно  указать  директиву  .EXTERNAL,  чтобы

  об'явить некоторые символы, которые определяются как  внеш-

  ние, но к которым ссылки выполняются в текущем модуле.

       2. Если директивой .DISABLE аргумент GLOBAL  запрещен,

  и программа макроассемблер обнаруживает символы, которые не

  определены в текущем модуле и не  перечислены  в  директиве

  .EXTERNAL, то выдается сообщение об ошибке.

       3. Альтернативной формой директивы .EXTERNAL  является

  директива .EXTRN.


       .GLOBAL - директива об'явления глобального символа
       --------------------------------------------------

       ДирективA  .GLOBAL  показывает,  что  определенные   в

  директиве символы либо определены в  текущем  модуле,  либо

  определены как внешние в других модулях.

       Формат

       .GLOBAL список символов

       Параметр

  список символов

       - список разрешенных символических  имен,  разделенных

         запятыми.




                           - 154 -

                        00152-01 35 01


       Пример.

   .GLOBAL SIN,COS           ; Эти символы известны

                             ; всем модулям

   .GLOBAL TAN               ; Участвующим в компоновке

       Примечания:

       1. Директива .GLOBAL введена в язык макроассемблер для

  обеспечения совместимости с языком макроассемблер  для  ЭВМ

  СМ  4.  Рекомендуется  вводить  глобальные  определения   с

  помощью двойных символов двоеточия и равенства,  а  внешние

  ссылки указывать в директиве .EXTERNAL.

       2. АЛЬТЕРНАТИВНОЙ ФОРМОЙ  ДИРЕКТИВЫ  .GLOBAL  ЯВЛЯЕТСЯ

  директива .GLOBL.


       .WEAK - директива подавления поиска символа
       -------------------------------------------

       Директива .WEAK указывает  символы,  которые  являются

  либо внешне определенными в другом модуле, либо  определен-

  ными глобально в текущем модуле. Директива .WEAK  подавляет

  поиск символа в любой библиотеке об'ектных модулей.

       Если в директиве .WEAK указан символ, не  определенный

  в текущем модуле, этот  символ  определяется  как  внешний.

  Если компоновщик находит определение этого символа в другом

  модуле, он разрешает символ с использованием этого  опреде-

  ления. Если компоновщик не  находит  внешнего  определения,

  символ приобретает значение нуль и компоновщик при этом  не

  сообщает об ошибке. Компоновщик не производит поиск указан-

  ного символа в библиотеке, однако если модуль,  извлеченный

  из библиотеки по другим причинам, содержит определение это-




                           - 155 -

                        00152-01 35 01


  го символа, компоновщик разрешает символ  с  использованием

  этого определения.

       Если в директиве .WEAK указан символ,  определенный  в

  текущем модуле, то этот символ рассматривается как глобаль-

  ный. Однако если данный модуль включен в библиотеку об'ект-

  ных модулей, то этот символ не включается в таблицу  симво-

  лов библиотеки. Следовательно, просмотр библиотеки во время

  компоновки с целью разрешения данного символа не влечет  за

  собой включение данного модуля в образ.

       Формат

       .WEAK список символов

       Параметр

  список символов

       - список разрешенных символических  имен,  разделенных

         запятыми.

       Пример.

       .WEAK      JUNE,JULE,MAY_30



       5.8. Директивы  определения  входной   точки

            программы



       .ENTRY - директива определения входной точки
       --------------------------------------------

       Директива .ENTRY определяет символическое имя  входной

  точки и маску сохранения  регистров  (2  байта).  Указанный

  символ определяется как глобальный символ, значение которо-

  го равно значению счетчика инструкций PC  в  точке  задания

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


                           - 156 -

                        00152-01 35 01


  качестве адреса передачи управления программы. Маска сохра-

  нения регистров используется для указания,  какие  регистры

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

  регистры автоматически восстанавливаются, когда данная про-

  цедура возвращает управление в вызывающую программу. Описа-

  ние инструкций вызова процедур приведено в документе [2].

       Формат

       .ENTRY символ,выражение

       Параметр

  символ

       - символическое имя входной точки 

  выражение

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

         выражение должно быть  абсолютным  выражением  и  не

         должно содержать никаких неопределенных символов.

       Пример.

   .ENTRY SYM,^M<R2,R4,R7>  ; процедура начинается

                            ; в данной точке

                            ; R2,R4,R7 сохранены

                            ; с помощью инструкций

                            ; CALL, RET

       Примечания:

       1. Для установки разрядов в маске сохранения регистров

  удобно пользоваться оператором регистровой маски (^М).

       2. Если указанное выражение имеет установленные разряды

  ды 0,1,12 и 13, возникает ошибка трансляции. Данные разряды

  соответствуют регистрам R0, R1, AP  и  FP  и  резервируются




                           - 157 -

                        00152-01 35 01


  операционной системой МОС ВП.

       3. Рекомендуется  использовать  директиву  .ENTRY  для

  определения всех  вызываемых  точек  входа,  включая  адрес

  передачи управления программы. Хотя  следующая  конструкция

  также определяет входную точку, но применять ее не рекомен-

  дуется:

       SYMBOL:: .WORD выражение


  хотя процедура, начинающаяся с  данной  конструкции,  может

  быть вызвана,входная маска не проверяется для  любых  недо-

  пустимых регистров и указанный  символ  (SYMBOL)  не  может

  быть использован с директивой .MASK.

       4. Директиву .ENTRY следует использовать для процедур,

  которые будут вызываться инструкцией CALLS или CALLG. Прог-

  рамма, в которую входят инструкции BSB или JSB,  не  должна

  использовать  наличие  маски  сохранения  регистров.  Такие

  программы должны начинаться со следующей конструкции:

       SYMBOL:: первая инструкция


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

  (SYMBOL)


       .MASK - директива маскирования
       ------------------------------

       По директиве .MASK происходит резервирование слова для

  маски  сохранения  регистров  предназначенной  для  вектора

  передачи управления.  Более  полная  информация  по  данной

  директиве и примеры ее использования приведены  в  описании

  директивы .TRANSFER.




                           - 158 -

                        00152-01 35 01


       Формат

       .MASK символ [,выражение]

       Параметры

  символ

       - символ, определенный в директиве .ENTRY.

  [,выражение]

       - маска сохранения регистров.

       Примечания:

       1. Если в директиве .MASK не указон параметр  "выраже-

  ние", то программа  макроассемблер  указывает  компоновщику

  скопировать в слово, зарезервированное по директиве  .MASK,

  маску сохранения регистров, указанную в директиве .ENTRY.

       2. Если в директиве .MASK указан параметр "выражение",

  то программа макроассемблер указывает программе компоновщи-

  ку  об'единить  в  слове,  зарезервированном  по  директиве

  .MASK, данное выражение и маску сохранения регистров,  ука-

  занную в директиве .ENTRY.  Об'единение  маски  во  входной

  точке программы и значения указанного выражения компоновщик

  выполняет по функции логического  "ИЛИ".  Следовательно,  в

  об'единенную маску сохранения регистров будут включены  как

  регистры указываемые в директиве .ENTRY,  так  и  регистры,

  указываемые в директиве .МАSK.


       .TRANSFER - директива передачи управления
       -----------------------------------------

       Директива .TRANSFER переопределяет  глобальный  символ

  для использования в разделяемом  образе.  После  компоновки

  разделяемого образа компоновщик переопределяет данный  сим-




                           - 159 -

                        00152-01 35 01


  вол как значение счетчика адресов программы в точке  дирек-

  тивы .TRANSFER.

       Программу, по возможности, не  следует  перекомпоновы-

  вать, когда изменяется разделяемый образ,  к  которому  эта

  программа прикомпонована. Однако это достижимо  только  при

  выполнении следующих двух условий:

       1) не изменился общий об'ем разделяемого образа;

       2) точки входа разделяемого образа не  изменили  своих

  адресов при изменении кода разделяемого образа и при  пере-

  компоновке образа.

       Чтобы избежать изменение об'ема  разделяемого  образа,

  при первичном создании этого образа резервируется  избыточ-

  ное пространство. Для уверенности в том, что входные  точки

  не изменились, стройте об'ектный модуль, содержащий  вектор

  передачи управления для каждой входной точки, и не изменяй-

  те порядок этих векторов  передачи  управления.  Компонуйте

  этот об'ектный модуль в начало разделяемого образа и  тогда

  адреса останутся фиксированными,  даже  если  исходный  код

  программы изменится. После каждой директивы .TRANSFER долж-

  на появляться маска сохранения регистров (только для проце-

  дур) и инструкция перехода к первой инструкции программы.

       Директива .TRANSFER не требует  никакой  памяти  и  не

  генерирует двоичный код. Она  только  формирует  инструкции

  для компоновщика по определению символа при создании разде-

  ляемого образа.

       Директива .TRANSFER может быть использована в процеду-

  рах, вход в которые осуществляется по инструкциям  CALLS  и




                           - 160 -

                        00152-01 35 01


  CALLG. В этом случае директива .TRANSFER используется  сов-

  местно с директивами .ENTRY и .MASK. Переход к  действующей

  программе должен осуществляться по адресу точки входа  плюс

  два. Добавление числа два к этому адресу  нужно  для  того,

  чтобы пропустить два байта, относящиеся к маске  сохранения

  регистров.

       Формат

       .TRANSFER символ

       Параметр

  символ

       - глобальный символ, который является  входной  точкой

         процедуры или программы.

       Пример.

      .TRANSFER ROUT_TEST

      .MASK     ROUT_TEST,^M<R4,R5> ; копирование входной

                                    ; маски по новому адресу

      BRW       ROUT_TEST+2         ; переход к ROUT_TEST

                                    ; минус входную маску

        .

        .

        .

      .ENTRY    ROUT_TEST,^M<R2,R3> ; точка входа и

                                    ; сохранение регистров

                                    ; R2 и R3

        .

        .

        .




                           - 161 -

                        00152-01 35 01


      RET

       В данном примере по директиве .MASK происходит копиро-

  вание входной маски программы в новый входной  адрес,  ука-

  занный директивой .TRANSFER. Если программа входит в состав

  разделяемого образа и вызывается, регистры 2,3,4 и 5 сохра-

  няются.



       5.9. Директивы и поддирективы трансляции



       .ENDC - директива конца блока условной трансляции
       -------------------------------------------------

       Директива .ENDC завершает  блок  условной  трансляции,

  начатый диретивой .IF.

       Формат

       .ENDC


       .IF - директива блока условной трансляции
       ----------------------------------------

       Блоком условной трансляции  называется  последователь-

  ность исходных предложений,  трансляция  которых  осуществ-

  ляется  только  при  соблюдении  некоторого  условия.  Блок

  условной трансляции начинается директивой .IF,  а  заканчи-

  вается директивой .ENDC. Для каждой  директивы  .IF  должна

  существовать соответствующая директива .ENDC. Директива .IF

  содержит правило проверки условия и один или два аргумента.

  Указанное правило проверки условия  распространяется  и  на

  данный аргумент (аргументы). Если проверка условия проходит

  успешно, то все предложения языка макроассемблер, заключен-

  ные между директивами .IF и .ENDC, транслируются.  Если  же



                           - 162 -

                        00152-01 35 01


  проверка показывает, что условие не выполняется, то указан-

  ные предложения не  транслируются.  Исключения  из  данного

  положения возникают, если используются поддирективы  услов-

  ной трансляции.

       Блоки условной трансляции могут быть вложенными друг в

  друга, то есть в состав одного  блока  условной  трансляции

  может входить другой блок условной трансляции. В этом  слу-

  чае вложенный блок условной трансляции будет транслировать-

  ся только в том случае, если выполняются условия для  внеш-

  него блока и для внутреннего одновременно.

       Формат

   .IF условие аргумент(ы)

       .

       .

       .

      блок

       .

       .

       .

    .ENDC

       Параметры

  условие

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

         чтобы данный блок условной трансляции был включен  в

         трансляцию. В табл. 24  приведены  условия,  которые

         могут быть проверены директивами  условной  трансля-

         ции.  Условие  должно  быть  отделено  от  аргумента




                           - 163 -

                        00152-01 35 01


         (аргументов) запятой, пробелом или символом  табуля-

         ции.

  аргумент(ы)

       - аргумент (аргументы) или выражение  (выражения)  для

         указанного правила проверки условия. Если аргументом

         является выражение, то оно не должно содержать неоп-

         ределенных символов и должно быть абсолютным.

  блок

       - блок предложений исходного текста программы, который

         включается в трансляцию при выполнении условия, ука-

         занного в директиве.

                                                   Таблица 24

     Условия, допустимые в директивах условной трансляции

  -----------------------------------------------------------

     Условие     !Дополнительное     !Tип  !Коли-!Условие,

     проверки    !условие проверки   !аргу-!чест-!при котором

  ---------------------------------- !мента!во   !блок транс-

              Формат                 !     !аргу-!лируется

  -----------------------------------!     !мен- !

  Полный   !Крат-! Полный      !Kрат-!     !тов  !

           !кий  !             !кий  !     !     !

  ---------!-------------------------------------------------

  EQUAL    ! EQ  !NOT_EQUAL    ! NE  !Выра-!  1  !Выражение=0

           !     !             !     !жение!     !(или # 0)

  GREATER  ! GT  !LESS_EQUAL   ! LE  !выра-!  1  !выражение>0

           !     !             !     !жение!     !(или <=0)

  LESS_THAN! LT  !GREATER_EQUAL! GE  !выра-!  1  !выражение<0




                           - 164 -

                        00152-01 35 01


                                         Продолжение табл. 24

  -----------------------------------------------------------
     Условие     !Дополнительное     !Tип  !Коли-!Условие,

     проверки    !условие проверки   !аргу-!чест-!при котором

  ---------------------------------- !мента!во   !блок транс-

              Формат                 !     !аргу-!лируется

  -----------------------------------!     !мен- !

  Полный   !Крат-! Полный      !Kрат-!     !тов  !

           !кий  !             !кий  !     !     !


  ---------!-------------------------------------------------

           !     !             !     !жение!     !(или >=0)

  DEFINED  ! DF  !NOT_DEFINED  ! NDF !сим- !     !символ оп-

           !     !             !     !вол  !     !ределен

           !     !             !     !     !     !(или не

           !     !             !     !     !     !определен)

       1)  !     !         1)  !     !     !     !

  BLANK    ! B   !NOT_BLANK    ! NB  !Макро!  1  !Аргумент

           !     !             !     !кома-!     !пропущен

           !     !             !     !нда  !     !(или не

           !     !         1)  !     !     !     !пропущен)

  IDENTICAL! IDN !DIFFERENT    ! DIF !Макро!  2  !Аргументы

           !     !             !     !кома-!     !идентичны

           !     !             !     !нда  !     !(или раз-

           !     !             !     !     !     !личны)

  --------------------

       1)
          Условия BLANK, NOT_BLANK, IDENTICAL и DIFFERENT

  полезны только в определениях макрокоманд. В разделе 6



                           - 165 -

                        00152-01 35 01



  директивы макрокоманд рассмотрены подробно.
 
      Пример.

  ;   пример директивы условной трансляции

   .IF EQUAL POINT+1 ; транслировать блок, если POINT+1=0

   .                 ; не транслировать блок, если POINT+1=0

   .

   .

   .ENDC

  ; вложенные директивы условной трансляции

   .IF     условие, аргумент(ы)

   .IF     условие, аргумент(ы)

    .

    .

    .

   .ENDC

   .ENDC

  ; директивы условной трансляции определяют, будет ли

  ; производиться трансляция

   .IF DEFINED  SYM1

   .IF DEFINED  SYM2

    .

    .

    .

   .ENDC

   .ENDC

       В последнем примере не происходит обработки  вложенных

  условных предложений программы, если не  выполняется  самое



                           - 166 -

                        00152-01 35 01


  внешнее условие. Поэтому для  того,  чтобы  исходный  текст

  программы был оттранслирован, необходимо, чтобы был опреде-

  лен как символ SYM1, так и символ SYM2.

       Примечания:

       1. Если директива .ENDC поевляется вне блока  условной

  трансляции, то выводится сообщение об ошибке.

       2. Программа МАКРОАССЕМБЛЕР допускает глубину вложения

  до 31 уровня условной трансляции. Если предложение пытается

  превысить допустимый уровень условной трансляции, то  выво-

  дится сообщение об ошибке.

       3.перед сравнением, аргументы в виде строки из  строч-

  ных букв преобразуются в строки прописных  букв,  если  эти

  строки не окружены ограничителями.

       4. Программа МАКРОАССЕМБЛЕР выводит сообщение об ошиб-

  ке, если в директиве .IF указано что-либо из следующего:

       - условие проверки, отличное от  приведенных  в  табл.

         24;

       - недопустимый аргумент;

       - пустой аргумент.

       5. Директивы .SHOW  и  .NOSHOW  определяют,  будет  ли

  включен в файл листинга блок условной  трансляции,  который

  не транслировался.


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

       Поддирективы  -  это  директивы  условной  трансляции,

  которые могут быть использованы только  в  блоках  условной

  трансляции директивы .IF.




                           - 167 -

                        00152-01 35 01


       В языке  макроассемблер  существует  три  поддирективы

  блока условной трансляции, которые описаны в табл. 25.

                                                   Таблица 25

  -----------------------------------------------------------

   Поддиректива  !            Функция

  -----------------------------------------------------------

   .IF_FALSE     ! Программа должна включать исходные предло-

                 ! жения, следующие за директивой .IF_FALSE и

                 ! продолжающиеся до  следующей  поддирективы

                 ! условной  трансляции  или  до  конца блока

                 ! условной  трансляции,  если условие прове-

                 ! ренное при входе  в блок условной трансля-

                 ! ции было ложным

   .IF_TRUE      ! Программа должна включать исходные предло-

                 ! жения, следующие  за  директивой .IF_FALSE

                 ! и продолжающиеся до следующей поддирективы

                 ! условной  трансляции  или  до  конца блока

                 ! условной трансляции,  если условие, прове-

                 ! ренное при входе  в блок условной трансля-

                 ! ции было истинным

   .IF_TRUE_FALSE! Программа всегда  включает в себя исходные

                 ! предложения,  следующие  за  директивой  и

                 ! продолжающийся  до  следующей поддирективы

                 ! .IF_TRUE_FALSE  условной  трансляции   или

                 ! до конца блока  условной  трансляции.  Эти

                 ! исходные  предложения  включаются  в прог-

                 ! рамму независимо от  того, является ли ус-




                           - 168 -

                        00152-01 35 01


                                         Продолжение табл. 25

  -----------------------------------------------------------

   Поддиректива  !            Функция

  -----------------------------------------------------------

                 ! ловие, проверенное  при  входе  в блок ус-

                 ! ловной трансляции, истинным или ложным


       Подразумеваемым   аргументом   поддирективы   условной

  трансляции является результат проверки  указанного  условия

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

  вы условной транляции не обрабатываются в  блоках  условной

  трансляции, если условие внешнего блока не выполняется.

       Блок  условной  трансляции,  содержащий   поддирективы

  условной трансляции отличается от блока  условной  трансля-

  ции. Если условие в директиве .IF не выполняется, то  внут-

  ренний блок (блоки) условной трансляции  не  транслируются,

  тогда как поддирективы условной трансляции  могут  вызывать

  трансляцию блока.

       Форматы

       .IF_FALSE

       .IF_TRUE

       .IF_TRUE_FALSE

       Пример 1.

       Предположим, что символ SYM определен:

   .IF DEFINED   SYM      ; условие выполняется, поскольку

                          ; символ SYM определен

     .                    ; трансляция следующего кода

     .



                           - 169 -

                        00152-01 35 01


     .

   .IF_FALSE              ; условие является ложным,

                          ; поскольку условие предыдущей

                          ; директивы .IF было истинным.

     .                    ; следующий код не

     .                    ; транслируется

     .

   .IF_TRUE               ; условие проверки истинно.

     .                    ; символ SYM определен

     .                    ; трансляция следующего кода

     .

     .

   .IF_TRUE_FALSE         ; следующий код транслируется

     .                    ; безусловно

     .                    ; трансляция остатка блока

     .                    ; условной трансляции

   .IF_TRUE

     .                    ; трансляция остатка блока

     .                    ; условной трансляции

     .

   .ENDC

       Пример 2.

       Предположим, что символ х определен, а символ Y нет:

   .IF DEFINED X ; условие является истинным. Символ X

                 ; определен

   .IF DEFINED Y ; условие является ложным. Символ Y не

                 ; определен




                           - 170 -

                        00152-01 35 01


   .IF_FALSE     ; условие является истинным. Символ Y не

                 ; определен

      .          ; трансляция следующего кода

      .

      .

   .IF_TRUE      ; условие является ложным. Символ Y не

                 ; определен

      .

      .          ; следующий код не транслируется

      .

      .

   .ENDC

   .ENDC

       Пример 3.

       Предположим, что символ а определен,а символ в нет:

   .IF DEFINED  A       ; условие является истинным. Символ

                        ; а определен

     .                  ; следующий код транслируется

     .

     .

   .IF_FALSE            ; условие является ложным. Символ а

     .                  ; определен. Следующий код не

     .                  ; транслируется

     .

   .IF NOT_DEFINED B    ; вложенная директива условной

     .                  ; трансляции не обрабатывается

     .




                           - 171 -

                        00152-01 35 01


   .ENDC

   .ENDC

       Пример 4.

       Предположим, что символ х не  определен,  а  символ  Y

  определен:

   .IF DEFINED    X    ; условие является ложным. Символ X

     .                 ; не определен

     .                 ; следующий код не транслируется

     .

   .IF DEFINED    Y    ; вложенная директива условной

     .                 ; трансляции не обрабатывается

     .

   .IF_FALSE           ; вложенная поддиректива условной

     .                 ; трансляции не обрабатывается

     .

     .

   .IF_TRUE            ; вложенная поддиректива условной

     .                 ; трансляции не обрабатывается

     .

     .

   .ENDC

   .ENDC

       Примечания:

       1. Если поддиректива  условной  трансляции  поевдяется 

  вне блока условной трансляции, то  выводится  сообщение  об

  ошибке.

       2. Альтернативными   формами    директив    .IF_FALSE,




                           - 172 -

                        00152-01 35 01


  .IF_TRUE и IF_TRUE_FALSE являются соответственно .IFF, .IFT

  и .IFTF.


       .IIF - директива непосредственной условной трансляции
       -----------------------------------------------------

       Директива .IIF представляет собой средство языка  мак-

  роассемблер  для  написания  однострочного  блока  условной

  трансляции. Условие, которое подвергается проверке, и  блок

  условной трансляции записываются полностью в той  же  самой

  строке, что и директива .IIF, при этом директива  .ENDC  не

  требуется.

       Формат

       .IIF условие [,] аргумент(ы), предложение

       Параметры

  условие

       - одно из допустимых условий, определенных в табл.  24

         для блоков условной трансляции. Данное условие долж-

         но отделяться  от  аргумента  (аргументов)  запятой,

         пробелом или символом табуляции, однако, если первый

         аргумент может  быть  пробелом,  то  условие  должно

         отделяться от аргумента (аргументов) запятой.

  аргумент(ы)

       - аргумент, связанный  с  непосредственной  директивой

         условной трансляции, (см. Табл. 25). Если аргументом

         является выражение, то оно не должно содержать ника-

         ких неопределенных символов и должно  быть  абсолют-

         ным. Аргумент (аргументы) должен отделяться от пред-

         ложения запятой.




                           - 173 -

                        00152-01 35 01


  предложение

       - предложение, которое  должно  транслироваться,  если

         условие выполняется.

       Пример.

          .IIF DEFINED     HELENA,        BEQL NAME


  если символ HELENA определен в исходной  программе,  данная

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

          BEQL NAME

       Примечание. Программа макроассемблер выводит сообщение

  об ошибке, если в директиве .IIF указано что-либо  из  сле-

  дующего:

       - условие проверки, отличное от  приведенных  в  табл.

         24;

       - недопустимый аргумент;

       - пустой аргумент.





   











                           - 174 -

                        00152-01 35 01


       5.10. Директивы перекрестных ссылок



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

       Если в командной строке для  программы  МАКРОАССЕМбЛЕР

  указан квалификатор /CROSSE_REFERENCE, то формируется  таб-

  лица перекрестных ссылок.  Директивы  .CROSSE  и  .NOCROSSE

  действительны только в том случае, если в командной  строке

  для MACRO был указан квалификатор /CROSS_REFERENGE.

       По умолчанию таблица перекрестных  ссылок  включает  в

  себя определения и все ссылки на каждый  символ  в  модуле.

  Таблица перекрестных ссылок может подавляться для всех сим-

  волов или для определенного списка символов.

       Задание директивы .NOCROSS без списка символов  запре-

  щает формирование таблицы ссылок для всех символов. Задание

  директивы  .CROSS  снова  разрешает  формирование   таблицы

  перекрестных ссылок (если директива задается  без  указания

  списка символов). Любое определение символа или  ссылка  на

  символ, появляющиеся в программе  после  задания  директивы

  .NOCROSS без списка символов и до задания директивы  .CROSS

  без списка аргументов, исключается из таблицы  перекрестных

  ссылок.

       Задание директивы .NOSROSS со списком символов  подав-

  ляет формирование таблицы перекрестных ссылок для  перечис-

  ленных символов. Задание директивы .CROSS со списком симво-

  лов снова разрешает формирование таблицы перекрестных  ссы-

  лок для перечисленных символов.



                           - 175 -

                        00152-01 35 01


       Форматы

       .CROSS

       .CROSS список символов

       .NOCROSS

       .NOCROSS список символов

       Параметр

  список символов

       - список разрешенных символических  имен,  разделенных

         запятыми.

       Пример.

           .NOCROSS            ; прекращение формирования

                               ; таблицы перекрестных ссылок

  COPY1:   MOVL     SYM1,SYM2  ; копирование данных

           .CROSS              ; продолжение формирования

                               ; таблицы перекрестных ссылок

       Определение метки COPY1 и ссылки  к  символам  SYM1  и

  SYM2 не входят в таблицы перекрестных ссылок.

           .NOCROSS SYM1      ; не включать символ SYM1

                              ; в таблицу перекрестных ссылок

  COPY2:   MOVL     SYM1,SYM2 ; копирование данных

           .CROSS   SYM1      ; продолжение формирования

                              ; таблицы перекрестных ссылок

                              ; для символа SYM1

       Определение символа COPY2 и ссылка к символу SYM2 вхо-

  дят в таблицу перекрестных ссылок, а символ SYM1 не  входит

  в таблицу перекрестных ссылок.

       Примечания:




                           - 176 -

                        00152-01 35 01


       1. Директива .CROSS, заданная без списка символов,  не

  вызывает продолжения формирования таблицы перекрестных ссы-

  лок для символов, указанных  в  списке  символов  директивы

  .NOCROSS.

       2. Если формирование таблицы перекресных  ссылок  зап-

  рещено для всех символов, задание директивы .CROSS со спис-

  ком символов не имеет действия до тех пор, пока  формирова-

  ние таблицы перекрестных ссылок не будет  продолжено  зада-

  нием директивы .CROSS без списка символов.


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

       Если в командной строке программы макроассемблер  ука-

  зан квалификатор /CROSS_REFERENCE, TO выполняется  построе-

  ние  таблицы  перекрестных  ссылок.  Директивы   .CROSS   и

  .NOCROSS определяют символы, которые включаются  в  таблицу

  перекрестных ссылок. Описание директивы .NOCROSS  приведено

  в описании директивы .CROSS.

       Форматы

       .NOCROSS

       .NOCROSS список символов

       Параметр

  список символов

       - список разрешенных символических  имен,  разделенных

         запятыми.








                           - 177 -

                        00152-01 35 01


       5.11. Директивы генерирования инструкций


       .OPDEF - директива определения кода операции
       --------------------------------------------

       По директиве .OPDEF происходит определение кода опера-

  ции, который включается в таблицу кодов  операций,  опреде-

  ляемых пользователем.  Программа  макроассемблер  выполняет

  поиск символа по этой таблице поиска его в таблице постоян-

  ных символов. С помощью этой директивы можно переопределить

  существующий код операции или создать новый.

       Формат

       .OPDEF код значение,список описателей операнда

       Параметры

  код

       - строка кодов КОИ-8,определяющая имя  кода  операции.

         Данная строка может быть  длиной  до  31  символа  и

         может содержать латинские буквы, цифры от 0 до 9,  а

         также специальные символы: символ подчеркивания (_),

         символ денежной единицы ($) и точку (.). Строка сим-

         волов не может начинаться с цифры и не  должна  быть

         заключена в ограничители.

  значение

       - выражение, определяющее значение кода операции. Дан-

         ное выражение не должно содержать никаких  неопреде-

         ленных символов и  должно  быть  абсолютным.  Данное

         выражение может иметь значение в диапазоне от  0  до

         65 535 (шестнадцатеричное FFFF), однако значения  от

         252 до 255 не  могут  быть  использованы.  Указанное




                           - 178 -

                        00152-01 35 01


         выражение представляется следующим образом:

       Если 0< выражение < 251, то выражение является

                                однобайтным кодом операции;

       Если выражение >255,     то разряды выражения 7...0

                                являются первым байтом ко-

                                да операции, а разряды

                                15...8 вторым байтом кода

                                операции.

       Значения 252...255 не могут  быть  использованы,  пос-

  кольку архитектура определяет их  как  начало  двухбайтного

  кода операции.

  Список описателей операнда

       - список описателей операнда, которые указывают  коли-

         чество операндов и тип  каждого  из  них.  В  списке

         допускается употребление до 16 описателей  операнда.

         Описатели операндов перечислены в табл. 26.


























                           - 179 -

                        00152-01 35 01


                                                 Таблица 26

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

   --------------------------------------------------------

          !                Типы данных

          !------------------------------------------------

          !  1)!   2)!   3)!   4)!   5)!  6)!  7)!  8)!  9)

     Тип  ! B  !  W  !  L  ! FF  ! FD  ! FG ! FH ! Q  ! о

   доступа!    !     !     !     !     !    !    !    !

   --------------------------------------------------------

   Адрес  ! AB ! AW  ! AL  ! AF  ! AD  ! AG ! AH ! AQ ! AO

   только ! RB ! RW  ! RL  ! RF  ! RD  ! RG ! RH ! RQ ! RO

   чтение !    !     !     !     !     !    !    !    !

   модифи-! MB ! MW  ! ML  ! MF  ! MD  ! MG ! MH ! MQ ! MO

   кация  !    !     !     !     !     !    !    !    !

   только ! WB ! WW  ! WL  ! WF  ! WD  ! WG ! WH ! WQ ! WO

   запись !    !     !     !     !     !    !    !    !

   поле   ! VB ! VW  ! VL  ! VF  ! VD  ! VG ! VH ! VG ! VO

   переход! BB ! BW  ! BL  ! BF  ! BD  ! BG ! BH ! BQ ! BO

  -------------------
  1)
     B   - байт

  2)
     W   - слово

  3)
     L   - длинное слово

  4)
     FF  - с плавающей запятой формата F

  5)
     FD  - с плавающей запятой формата D

  6)
     FG  - с плавающей запятой формата G



                           - 180 -

                        00152-01 35 01



  7)
     FH  - с плавающей запятой формата H

  8)
     Q   - квадрослово

  9)
     O   - октаслово

       Пример.

   .OPDEF   MOVL3  ^XA9FF,RL,ML,WL ; определяется инструкция

                                   ; MOLV3,  которая исполь-

                                   ; зует  зарезервированный

                                   ; код операции FF

   .OPDEF   DIVF2  ^X46,RF,MF      ; переопределяются

   .OPDEF   MOVC5  ^X2C,RW,AB,AB,RW,AB;инструкции DIVF2 и

                                   ; MOVC5

   .OPDEF   CALL   ^X10, BB        ; эквивалентно BSBB



       Примечания:

       1. Для переопределения кода операции возможно  исполь-

  зование макрокоманды. Отметим, что поиск символа выполняет-

  ся сначала в таблице имен макрокоманд, а  затем  в  таблице

  кодов операций, определенных пользователем.


       2. Директива .OPDEF оказывается полезной при  создании

  "пользовательских" инструкций, которые выполняются по  мик-

  ропрограмме,  написанной  пользователем.  Данная  директива

  позволяет программистам выполнять их микропрограммы в  сос-

  таве программ на языке макроассемблер.


       3. Описатели операнда указываются в таком же  формате,




                           - 181 -

                        00152-01 35 01


  что и запись указателя операнда, описанная в документе [2],

  а именно: первый символ указывает на тип доступа к  операн-

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


       .REF - директивы генерирования операнда
       ----------------------------------------


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

  операндов, представленных в табл. 27, которые  используются

  в макрокомандах для определения новых кодов операций.

                                                 Таблица 27

   --------------------------------------------------------

     Директива !           Функция

   --------------------------------------------------------

       .REF1   ! Генерирует операнд в виде байта

       .REF2   ! Генерирует операнд в виде слова

       .RеF4   ! Генерирует операнд в виде длинного слова

       .RЕF8   ! Генерирует операнд в виде квадрослова

       .RЕF16  ! Генерирует операнд в виде октасловA


       Директивы .RЕF обеспечивают совместимость  с  МАКРОАС-

  СЕМБЛЕРОМ ранних  версий.  Директива  .OPDEF  предоставляет

  более широкие функциональные возможности и по  сравнению  с

  директивами .REF  ею  проще  пользоваться.  Поэтому  вместо

  директив .REF следует использовать директиву .OPDEF.

       Форматы

       .REF1 операнд

       .REF2 операнд

       .REF4 операнд




                           - 182 -

                        00152-01 35 01


       .REF8 операнд

       .REF16 операнд

       Параметр

  операнд

       - операнд в виде, соответственно, байта, слова,  длин-

         ного слова, квадрослова или октаслова.

       Пример.

   .MACRO  MOVL3, M, N, L

   .BYTE   ^XFF, ^XA9

   .REF4   M                       ; операнды

                                   ; представлены

   .REF4   N                       ; в виде

                                   ; длинных слов

   .REF4   L

   .ENDM   MOVL3

   MOVL3   R0,@MN-1,(R7)+[R10]

       В  данном  примере  используется  директива  .REF4,  с

  помощью которой создается новая инструкция MOVL3. Для  этой

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

  В примере, приведенном для директивы  .OPDEF,  используется

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
















                           - 183 -

                        00152-01 35 01


       5.12. Директива дополнительной компоновки



       .LINK - директива дополнительной компоновки
       --------------------------------------------


       Директива .LINK позволяет включать во время трансляции

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

  .LINK используется для ссылок, которые необходимо  включить

  в отдельный образ. Использование директивы .LINK  позволяет

  не указывать имена этих ссылок в команде  LINK  языка  DCL.

  Квалификаторы директивы .LINK выполняют функции, сходные  с

  функциями, выполняемыми такими же  квалификаторами  команды

  LINK языка DCL.


       Формат

       .LINK "спец.файла" [/квалиф.[=(имя модуля],...])],...]

       Параметры

  спец.файла

       - спецификация  файла,   представляющая   ограниченную

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

         входных файлов.  Ограничителями  строки  может  быть

         любая пара знаков, кроме пробела,  знака  табуляции,

         знака равенства (=),  точки  с  запятой  (;),  левой

         угловой скобки (<). Знак,  используемый  в  качестве

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

         Алфавитно-цифровые знаки могут быть  использованы  в

         качестве ограничителей, однако, для избежания  недо-

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





                           - 184 -

                        00152-01 35 01


       Входными файлами могут быть об'ектные модули,  которые

  необходимо скомпоновать, библиотеки, которые определены для

  внешних ссылок  или  из  которых  специфицированные  модули

  должны быть включены, или разделяемые образы, которые долж-

  ны быть включены в выходной образ. Если  определяется  нес-

  колько входных файлов, то они должны быть разделены запяты-

  ми (,).

       Если тип файла не определяется в спецификации входного

  файла, то компоновщик использует типы файлов по  умолчанию,

  основываясь на характере  файла.  Предполагается,  что  все

  об'ектные файлы имеют тип файла OBJ.

       Следует  заметить,  что  спецификации  входных  файлов

  должны быть известны к моменту компоновки. Необходимо, что-

  бы все ссылки были определенными, так как,  если  об'ектный

  модуль, созданный программой макроассемблер, скомпонован  в

  другой директории, чем та, в которой он был создан, то ком-

  поновщик будет искать файлы, на которые производятся  ссыл-

  ки, в директиве .LINK.

       Знак звездочка в спецификации файла не допускается.



       Квалификаторы файла

  /INCLUDE=(имя модуля[,...])

       - квалификатор показывает, что входной  файл  является

         об'ектной библиотекой или  библиотекой  разделяемого

         образа, а так же, что специфицированные имена  моду-

         лей являются  обязательными  входными  модулями  для

         компоновщика.




                           - 185 -

                        00152-01 35 01


       По крайней мере одно имя модуля должно быть специфици-

  ровано. Если специфицируется более, чем одно имя модуля, то

  их имена разделяются запятыми и весь список имен заключает-

  ся в круглые скобки.

       При использовании квалификатора /INCLUDE можно так  же

  использовать квалификатор /LIBRARY, при этом для  определе-

  ния оставшихся неразрешенных ссылок используется  библиоте-

  ка.

       Знак звездочка в спецификации имени  файла  не  допус-

  кается. Имена модулей не могут содержать более 31 символа.

  /LIBRARY

       - квалификатор показывает, что соответствующий входной

         файл является библиотекой,  в  которой  производится

         поиск модулей для  разрешения  любых  неопределенных

         символов во входных файлах.

       Если спецификация соответствующего входного  файла  не

  содержит тип файла, то компоновщик по  умолчанию  предпола-

  гает тип файла OLB. Можно  использовать  оба  квалификатора

  /INCLUDE и /LIBRARY для определения спецификации  файла.  В

  этом случае явное включение модулей производится  в  первую

  очередь, а затем используется библиотека для поиска  нераз-

  решенных ссылок.

  /SELECTIVE_SEARCH

       - квалификатор указывает компоновщику о  необходимости

         добавить к таблице  символов  из  специфицированного

         файла только те глобальные символы, которые  опреде-

         лены в файле  и  являются  текущими  неразрешенными.




                           - 186 -

                        00152-01 35 01


         если этот квалификатор  не  указан,  то  компоновщик

         включает все символы из специфицированного  файла  в

         таблицу глобальных символов.

  /SHAREABLE

       - квалификатор требует, чтобы компоновщик включил файл

         разделяемого образа. Символ звездочка в спецификации

         файла не допускается.

       Табл. 28 показывает сокращенные наименования  квалифи-

  каторов для директивы  .LINK.  Следует  отметить,  что  для

  удобства чтения, а так же для совместимости с  последующими

  версиями, рекомендуется пользоваться полными наименованиями

  квалификаторов.


                                                   Таблица 28

  -----------------------------------------------------------

      Квалификатор               !  Сокращенное наименование

  -----------------------------------------------------------

       /INCLUDE                  !             /I

       /LIBRARY                  !             /L

       /SELECTIVE_SEARCH         !             /SE

       /SHAREABLE                !             /SH

       Пример 1.

       .LINK "SYS$LIBRARY:MYLIB" /INCLUDE=(MOD1, MOD2, MOD6)

       При обработке данного предложения в  файле  MYPROG.MAR

  макроассемблер посылает компоновщику запрос о необходимости

  скомпоновать MYPROG.OBJ с модулями MOD1, MOD2, MOD6 из биб-

  лиотеки SYS$LIBRARY:MYLIB.OLB (где SYS$LIBRARY - логическое

  имя  для  диска  и  директории,  в  котором  записан   файл



                           - 187 -

                        00152-01 35 01


  MYLIB.OLB). Для других неразрешенных ссылок поиск библиоте-

  ки не производится. Это предложение эквивалентно компоновке

  файла с помощью команд языка DCL.

       Пример 2.

   $ LINK MYPROG, SYS$LIBRARY:MYLIB /INCLUDE=(MOD1,MOD2,MOD6)

  ; скомпоновать с об'ектным модулем SYS$LIBRARY:MYOBJ.OBJ

   .LINK \SYS$LIBRARY:MYOBJ\

  ; найти об'ектную библиотеку SYS$LIBRARY:YOURLIB.OLB для

  ; неразрешенных ссылок

   .LINK 'SYS$LIBRARY:YOURLIB' /LIBRARY

  ; найти таблицу символов SYS$LIBRARY:MYSTB.STB  для

  ; неразрешенных ссылок

   .LINK *SYS$LIBRARY:MYSTB.STB* /SELECTIVE_SEARCH

  ; скомпоновать с разделяемым образом

   .LINK "SYS$LIBRARY:MYSHR.EXE" /SHAREABLE

       В целях оптимизации выполнения несколько входных  фай-

  лов могут быть включены в одну директиву .LINK. В примере 3

  показано как пять предыдущих предложений могут быть  выпол-

  нены в одном.

       Пример 3.

   .LINK  'SYS$LIBRARY:MYOBJ',-

          'SYS$LIBRARY:YOURLIB' /LIBRARY,-

          'SYS$LIBRARY:MYLIB' /INCLUDE=(MOD1, MOD2, MOD6),-

          'SYS$LIBRARY:MYSTB.STB' /SELECTIVE_SEARCH,-

          'SYS$LIBRARY:MYSHR.EXE' /SHAREABLE








                           - 188 -

                        00152-01 35 01


                       6. МАКРОКОМАНДЫ



       С помощью макрокоманд программист может заменить целую

  последовательность строк исходного текста  программы  всего

  лишь одной строкой.

       Исходный текст макрокоманды содержится  в  определении

  макрокоманды. Определение макрокоманды может содержать фор-

  мальные аргументы (а может и не содержать формальных  аргу-

  ментов). Данные формальные аргументы могут использоваться в

  пределах последовательности исходных строк. Позже  формаль-

  ные  аргументы  заменяются  фактическими  аргументами;  это

  происходит при вызове макрокоманды.

       Команда вызова макрокоманды включает в себя имя данной

  макрокоманды, за которым могут следовать фактические  пара-

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

  содержащей макровызов на исходный текст, который содержится

  в макроопределении данной макрокоманды. Программа  макроас-

  семблер также производит замену формальных аргументов  всю-

  ду, где они присутствуют в макроопределении, на  соответст-

  вующие фактические аргументы, указанные в макровызове. Этот

  процесс называется расширением макрокоманды.

       По умолчанию макрорасширение не распечатывается в лис-

  тинге трансляции. Распечатка макроопределения  производится

  только в том случае, если в директиве .SHOW (см. Раздел  5)

  или в квалификаторе /SHOW, который описан в документе  [1],

  указан аргумент EXPANSIONS. Во всех примерах, приведенных в

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




                           - 189 -

                        00152-01 35 01


  была указана директива .SHOW EXPANSION в исходном файле или

  в командной строке для макроассемблера был указан  квалифи-

  катор /SHOW = EXPANSIONS.

       Примечание. В дальнейшем вместо терминов:  определение

  макрокоманды, вызов макрокоманды и расширение  макрокоманды

  будут употребляться более удобные  термины:  макроопределе-

  ние, макровызов и макрорасширение.

       Директивы макрокоманд обеспечивают средства для выпол-

  нения функций различных видов. В табл. 29  перечислены  эти

  виды функций и приведены директивы,  которые  их  обеспечи-

  вают.  Для  облегчения  ссылок  все  директивы  макрокоманд

  представлены в алфавитном порядке.




                                                  Таблица 29

           Краткие сведения о директивах макрокоманд

  ----------------------------------------------------------

       Вид функции                       !  Директива

  ----------------------------------------------------------

  Директивы макроопределений             !  .MACRO

                                         !  .ENDM

  Директивы библиотеки макрокоманд       !  .LIBRARY

                                         !  .MCALL

  Директива удаления макрокоманд         !  .MDELETE

  Директива выхода из макрокоманды       !  .MEXIT

  Директивы атрибутов аргументов         !  .NSHR
                                           



                           - 190 -

                        00152-01 35 01


                                        Продолжение табл. 29

  ----------------------------------------------------------

       Вид функции                       !  Директива

  ----------------------------------------------------------

                                         !  .NTYPE

                                         !                1)

  Директива блока  повторений            !  .REPEAT(.REPT)

  Директива конца блока повторений       !  .ENDR

  Директивы блоков неопределенных        !  .IRP

  повторений                             !  .IRPC

  ------------------
  1)
     Альтернативные формы директив (если они существуют)

     приведены в круглых скобках.


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


       Макрокоманды имеют аргументы двух  типов:  фактические

  аргументы и формальные аргументы. Фактические  аргументы  -

  это строки, заданные в макровызове после имени  макрокоман-

  ды. Формальные аргументы указываются по имени в  макроопре-

  делении, то  есть  после  имени  макрокоманды  в  директиве

  .MACRO. Фактические аргументы в макровызовах  и  формальные

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

  символами табуляции или пробелами.

       Количество фактических аргументов в макровызове  может

  быть равно или меньше количества  формальных  аргументов  в

  макроопределении. Но  если  только  количество  фактических

  аргументов больше, чем  количество  формальных  аргументов,




                           - 191 -

                        00152-01 35 01


  макроассемблер выводит сообщение об ошибке.

       Обычно между формальными  и  фактическими  аргументами

  установлено строгое позиционное соответствие. То есть  пер-

  вый фактический аргумент в макровызове замещает первый фор-

  мальный аргумент в макроопределении во всех точках, где  он

  только появляется. Однако в  случае  употребления  ключевых

  аргументов это строгое позиционное соответствие может  быть

  отвергнуто.

       В примере 1 дается макроопределение, в котором исполь-

  зуются формальные аргументы.

       Пример 1.

   .MACRO    SAVE      ARG1,ARG2,ARG3

   .LONG     ARG1                    ; ARG1 первый аргумент

   .WORD     ARG3                    ; ARG3 третий аргумент

   .BYTE     ARG2                    ; ARG2 второй аргумент

   .ENDM     SAVE

       Примеры 2 ,3 иллюстрируют возможные макровызовы и мак-

  рорасширения приведенного макроопределения.

       Пример 2.

       SAVE     30,20,10  ; первый макровызов

       .LONG    30        ; 30 - первый аргумент

       .WORD    10        ; 10 - третий аргумент

       .BYTE    20        ; 20 - второй аргумент

       Пример 3.

        SAVE  X,X-Y,Z     ; второй макровызов

        .LONG X           ; X первый аргумент

        .WORD Z           ; Z третий аргумент




                           - 192 -

                        00152-01 35 01


        .BYTE X-Y         ; X-Y второй аргумент



       6.1.1. Значения по умолчанию


       Значениями по умолчанию являются те значения,  которые

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

  том случае, если  в  макровызове  для  данного  формального

  аргумента не указано никакого значения.

       Значения по умолчанию указываются в  директиве  .MACRO

  следующим образом:

       Имя формального аргумента = значение по умолчанию

       В примере 1 макроопределения указываются  значения  по

  умолчанию.

       Пример 1.

          .MACRO  DEFINE  B=5,W=10,Q=1000

          .BYTE   B

          .WORD   W

          .QUAD   Q

          .ENDM   DEFINE

       Примеры 2,3,4  иллюстрируют  возможные  макровызовы  и

  макрорасширения приведенного макроопределения.

       Пример 2.

   DEFINE         ; аргументы не указаны

   .BYTE  5

   .WORD  10

   .QUAD  1000







                           - 193 -

                        00152-01 35 01


       Пример 3.

   DEFINE ,30,40  ; указаны второй и третий аргументы

   .BYTE  5

   .WORD  30

   .QUAD  40

       Пример 4.

   DEFINE XYZ     ; указан первый аргумент

   .BYTE  XYZ

   .WORD  10

   .QUAD  1000



       6.1.2. Ключевые аргументы


       Использование ключевых аргументов позволяет  указывать

  аргументы в макровызове в произвольном порядке, однако  при

  этом в макровызове должны указываться  те  же  самые  имена

  формальных аргументов, которые присутствуют в  макроопреде-

  лении. Ключевые аргументы оказываются полезными в тех  слу-

  чаях, когда макроопределение имеет много  формальных  аргу-

  ментов, и только некоторые из них нужно указать в  макровы-

  зове.

       В одном макровызове аргументы  должны  быть  либо  все

  позиционно-зависимые, либо все ключевые. Если в одной  мак-

  рокоманде смешаны позиционно-зависимые и ключевые  аргумен-

  ты, то только позиционно-зависимые аргументы  соответствуют

  по позиции формальным аргументам, а ключевые  аргументы  не

  используются вовсе. Если формальный аргумент  соответствует

  как позиционно-зависимому аргументу, так и ключевому  аргу-



                           - 194 -

                        00152-01 35 01


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

  отвергает любое другое определение  аргумента  для  данного

  аргумента.

       В примере 1 макроопределения указываются три  аргумен-

  та.

       Пример 1.

          .MACRO  SAVE    A1,A2,A3

          .LONG   A1

          .WORD   A2

          .WORD   A3

          .ENDM   SAVE

       В примере 2 макровызова указаны ключевые аргументы.

       Пример 2.

          SAVE    A3=5,A2=17,A1=COS

          .LONG   COS

          .WORD   5

          .WORD   17



       6.1.3. Аргументы в виде строки символов


       Если фактический аргумент  представляет  собой  строку

  символов, в состав которой входят такие символы, как напри-

  мер, запятая, пробел, символ  табуляции,  которые  макроас-

  семблер интерпретирует как разделители,  то  данная  строка

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

  ограничителями обычно являются парные угловые скобки (< >).

  Кроме того, макроассемблер интерпретирует в качестве  огра-

  ничителей любые символы, следующие за  уголком  вверх  (^).



                           - 195 -

                        00152-01 35 01


  таким образом, в случае, если угловые скобки должны исполь-

  зоваться в качестве элементов самой строки символов,  прог-

  раммист  может  применить  формат  ограничителя  с  уголком

  вверх.

       Рассмотрим примеры аргументов макрокоманд, заключенных

  между ограничителями.

       Примеры:

  1.        <THIS   IS A TEST! ISN'T IT?>

  2.        <DATE:  1-MAY-1985>

  3.        <CLEAR: CLRW    @(R2)+[R4]>

  4.        ^%STRING IS FIRST <LAST> FOR AREA%

  5.        ^?STACK POINTER <SP OR R14>?

       В примерах 4,5 начальный уголок вверх указывает на то,

  что символ процента (%) и символ вопроса (?) являются огра-

  ничителями. Заметьте, что уголок вверх указывается только с

  левым ограничителем.

       Макроассемблер  воспринимает  фактический  аргумент  в

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

  один фактический аргумент и ставит ему в соответствие толь-

  ко один формальный аргумент. Если аргумент  в  виде  строки

  символов, содержащий разделительные  символы,  не  заключен

  между ограничителями, то макроассемблер интерпретирует  его

  как группу последовательных аргументов и ставит ему в соот-

  ветствие последовательные формальные аргументы.

       Пример 6 иллюстрирует макровызов, который  имеет  один

  формальный аргумент.






                           - 196 -

                        00152-01 35 01


       Пример 6.

       .MACRO   REPEAT STRING

       .ASCII  /STRING/

       .ASCII  /STRING/

       .ENDM   REPEAT

       Примеры 7 и 8  макровызова  демонстрируют  фактические

  аргументы, один из которых указан без ограничителей, а дру-

  гой с ограничителями.

       Пример 7.

     REPEAT   <D R I V E R>

     .ASCII   /D R I V E R/

     .ASCII   /D R I V E R/

     REPEAT   D R I V E R

     %MACRO-E-TOOMNYARGS, TOO MANY ARGUMENTS IN MACRO CALL

  макроассемблер выдает сообщение "в макровызове слишком мно-

  го аргументов".

       Отметим, что макроассемблер интерпретирует второй мак-

  ровызов как макровызов, содержащий шесть фактических  аргу-

  ментов, а не один аргумент с пробелами.

       Когда происходит вызов макрокоманды, до того, как пос-

  тавить формальные аргументы в соответствие указанной строке

  символов, программа  макроассемблер  удаляет  ограничители,

  между которыми заключена указанная  строка  символов  (если

  они существуют).

       Если строка символов включает в себя точку с  запятой,

  то эта строка символов также должна быть заключена в  огра-

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




                           - 197 -

                        00152-01 35 01


  чать начало поля комментария.

       Строка символов, заключенная между ограничителями,  не

  может быть продолжена на следующую строку исходной програм-

  мы.

       Чтобы передать в  строке  символов  число,  содержащее

  операцию указания основания счисления или унарную  операцию

  (например, ^XF19), необходимо, чтобы аргумент  целиком  был

  заключен между ограничителями, иначе  макроассемблер  будет

  интерпретировать операцию основания счисления как ограничи-

  тель. Рассмотрим  пример  аргументов  макрокоманд,  которые

  заключены между ограничителями, поскольку они содержат опе-

  рации указания основания счисления.

       Пример 8.

          <^B11001100>

          <^XFFFF>

          <^F2.4>

       Макрокоманды могут быть вложенными, то есть макроопре-

  деление может содержать вызов другой макрокоманды.  Если  в

  рамках одного макроопределения вызывается  другая  макроко-

  манда и при этом передается аргумент в виде  строки  симво-

  лов, программист должен ввести ограничение  аргумента  так,

  чтобы во вторую макрокоманду полная строка передавалась как

  один аргумент.

       Пример 9 макроопределения содержит вызов  макрокоманды

  REPEAT.








                           - 198 -

                        00152-01 35 01


       Пример 9.

          .MACRO  PART    ARG1,ARG2,STRING

          .WORD   ARG1

          .WORD   ARG2

          REPEAT  <STRING>

          .ENDM   PART

       Следует заметить, что аргумент  в  макровызове  RеPеат

  заключен в угловые скобки, несмотря на то, что  фактический

  аргумент не содержит  каких-либо  разделительных  символов.

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

  макровызове REPEAT в то же время является формальным  аргу-

  ментом в этом макроопределении и будет замещаться фактичес-

  ким аргументом, который может содержать разделительные сим-

  волы.

       В примере 10 осуществляется вызов  макрокоманды  PART,

  из которой в свою очередь производится  вызов  макрокоманды

  REPEAT.

       Пример 10.

          PART    1945,1985,<40 YEARS>

          .WORD   1945

          .WORD   1985

          REPEAT  <40 YEARS>

          .ASCII  /40 YEARS/

          .ASCII  /40 YEARS/

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

  лов во вложенных макрокомандах  заключается  в  ограничении

  аргументов макрокоманд вложенными  ограничителями.  В  этом




                           - 199 -

                        00152-01 35 01


  случае макровызовы, входящие в состав макроопределения,  не

  должны содержать ограничителей. Каждый раз, когда аргумент,

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

  ве, макроассемблер до того, как поставить его в  соответст-

  вие с формальным аргументом, удаляет внешнюю пару ограничи-

  телей. Такой метод не рекомендуется использовать, поскольку

  в этом случае требуется,  чтобы  программист  знал  глубину

  вложения макрокоманд.

       В примере 11  макроопределение  также  содержит  вызов

  макрокоманды REPEAT.

       Пример 11.

          .MACRO  PART2   ARG1,ARG2,STRING

          .WORD   ARG1

          .WORD   ARG2

          REPEAT  STRING

          .ENDM   PART2

       В макроопределении аргумент в  макровызове  REPEAT  не

  заключен в угловые скобки.

       В примере 12 содержится вызов макрокоманды PART2.

       Пример 12.

          PART2   1917,1985,<<68 YEARS>>

          .WORD   1917

          .WORD   1985

          REPEAT  <68 YEARS>

          .ASCII  /68 YEARS/

          .ASCII  /68 YEARS/

       Следует заметить, что хотя макровызов  REPEAT  в  мак-




                           - 200 -

                        00152-01 35 01


  роопределении не заключен в ограничители,  однако  вызов  в

  макрорасширении  оказывается  заключенным  в  ограничители,

  поскольку аргумент в виде  строки  символов  в  макровызове

  PART2 заключен во вложенные ограничители.



       6.1.4. Конкатенация аргументов


       Операция конкатенации аргументов, символ апостроф ('),

  выполняет об'единение аргументов макрокоманд в единый неде-

  лимый текст. Апостроф может либо следовать за  именем  фор-

  мального аргумента, либо предшествовать ему.

       Если апостроф предшествует имени аргумента,  то  текст

  до апострофа об'единяется  с  фактическим  аргументом  (при

  расширении  макрокоманды).  Например,  если   символ   ARG1

  является формальным аргументом, которому поставлен в  соот-

  ветствие фактический аргумент TEST, TO форма TEXT'ARG1 рас-

  ширяется в TEXTTEST.

       Если апостроф следует за именем формального аргумента,

  то при расширении макрокоманды фактический аргумент об'еди-

  няется с текстом, следующим за апострофом.  Например,  если

  символ ARG2 является формальным аргументом,  которому  пос-

  тавлен в соответствие фактический аргумент  MOV,  то  форма

  ARG2'L расширяется в MOVL. Отметим, что сам символ апостроф

  не появляется в макрорасширении.

       Для конкатенации двух аргументов  разделите  два  фор-

  мальных аргумента двумя последовательными апострофами.  Два

  апострофа необходимы по той причине,  что  каждая  операция

  конкатенации отбрасывает из расширения один апостроф.



                           - 201 -

                        00152-01 35 01


       В примере макроопределения  используется  конкатенация

  аргументов.

       Пример.

          .MACRO  CMND    INST,SIZE,NUM

  CMN'NUM':

          INST''SIZE      R'NUM

  CMN'NUM'Z:

          .ENDM   CMND

       Отметим, что для конкатенации двух формальных докумен-

  тов INST и SIZE использованы два последовательных  апостро-

  фа.

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

  макрорасширение.

          CMND    CLR,W,2

  CMN2:   CLRW    R2

  CMN2Z:



       6.1.5. Символьное    представление    числовых

              аргументов


       Если в качестве фактического аргумента указан  символ,

  то в макрокоманду передается имя этого символа,  а  не  его

  числовое значение. Однако посредством включения перед  сим-

  волом в вызове обратной косой черты (\) может быть передано

  значение данного символа.  Затем  программа  макроассемблер

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

  значение символа. Например, если символ COUNT имеет  значе-

  ние 2, и указан фактический аргумент /COUNT, то в  макроко-



                           - 202 -

                        00152-01 35 01


  манду передается строка "2", а не имя символа "COUNT".

       Особенно полезной передача числового значения  символа

  оказывается при создании новых символов совместно с  опера-

  цией конкатенации аргументов (').

       В примере 1 рассматривается макроопределение для пере-

  дачи числовых значений символов.

       Пример 1.

   .MACRO SPRING,ARG1,ARG2=^?^M<>?

   .ENTRY DAY'ARG1,ARG2

   .ENDM  SPRING

       Пример 2 демонстрирует возможный макровызов  и  макро-

  расширение для рассмотренного макроопределения SPRING.

       Пример 2.

  MARCH=8

          SPRING  \MARCH

          .ENTRY  DAY8,^M<>



  MARCH=MARCH+23

          SPRING  \MARCH,^?^M<R0,R1>?

          .ENTRY  DAY31,^M<R0,R1>














                           - 203 -

                        00152-01 35 01


       6.1.6. Автоматически   создаваемые   локальные

              метки


       В  макрокомандах  локальные  метки  часто  оказываются

  очень полезным средством. Хотя программист  и  имеет  право

  указывать  локальные  метки  в  макроопределениях,  но  эти

  локальные метки могут оказаться сдублированными в  одном  и

  том же блоке локальных меток, что приводит к ошибке. Однако

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

  создания локальных  меток  в  макрорасширении,  которые  не

  вступят в конфликт  с  другими  локальными  метками.  Такие

  локальные  метки  называются   автоматически   создаваемыми

  локальными метками.

       Автоматически создаваемые локальные метки имеют диапа-

  зон значений от 30000$ до 65535$. Каждый  раз,  когда  мак-

  роассемблер создает новую локальную  метку,  он  производит

  увеличение числовой части имени этой метки на  1.  Следова-

  тельно, в диапазоне от 30000$  до  65535$  не  должно  быть

  никаких определяемых пользователем локальных меток.

       Программист указывает на создаваемую  локальную  метку

  символом вопроса (?), который ставится  перед  именем  фор-

  мального аргумента. При расширении  макрокоманды  программа

  макроассемблер создает новую локальную метку в том  случае,

  если пропущен фактический  аргумент.  Если  соответствующий

  фактический  аргумент  указан,   программа   макроассемблер

  производит его подстановку  вместо  формального  аргумента.

  Автоматически создаваемые локальные метки  могут  использо-

  ваться только для первых 31 формальных аргументов,  указан-



                           - 204 -

                        00152-01 35 01


  ных в директиве .MACRO.

       Автоматически создаваемые  локальные  метки  не  могут

  сочетаться с позиционно-зависимыми фактическими  аргумента-

  ми. Автоматически  создаваемые  локальные  метки  не  могут

  сочетаться с фактическими аргументами, представленными клю-

  чевыми словами.

       В примере 1 макроопределения  употребляются  автомати-

  чески создаваемые локальные метки.

       Пример 1.

          .MACRO  WINTER          FEB,?LAB

          TSTW    FEB

          BGTR    LAB

          MOVW    FEB,R0

  LAB:

          .ENDM   WINTER

       В примере 2 иллюстрируется как употребление  локальных

  меток, определяемых пользователем, так и употребление авто-

  матически создаваемых локальных меток.

       Пример 2.

          WINTER  R1

          TSTW    R1

          BGTR    30000$

          MOVW    R1,R0

  30000$:

          WINTER  DEC

          TSTW    DEC

          BGTR    30001$




                           - 205 -

                        00152-01 35 01


          MOVW    DEC,R0

  30001$:

          WINTER  JAN,20$

          TSTW    JAN

          BGTR    20$

          MOVW    JAN,R0

  20$:



       6.1.7. Строковые операции макрокоманд


       Строковыми операциями макрокоманд для обработки строки

  символов являются следующие:

       %LENGTH

       %LOCATE

       %EXTRACT

       Эти  операции  производят  определенные  действия  над

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

  символов, и над строками кодов КОИ-8. Они  могут  использо-

  ваться только в макрокомандах и в блоках повторений. В под-

  пунктах 6.1.7.1 - 6.1.7.3 даны описания этих операций, при-

  ведены их форматы и представлены примеры их использования.

















                           - 206 -

                        00152-01 35 01


       6.1.7.1. Операция %LENGTH


       Операция %LENGTH определяет значение длины строки сим-

  волов. Например, значение операции  %LENGTH(<ABCDE>)  равно

  5.

       Формат

       %LENGTH(строка)

       Параметр

  строка

       - аргумент макрокоманды или ограниченная строка симво-

         лов, которая может  быть  заключена  между  угловыми

         скобками или между одинаковыми символами, первому из

         которых предшествует уголок вверх.

       Пример.

       Макроопределение:

   .MACRO SIZE,STR

   .IF GREATER    8-%LENGTH(STR)  ; если длина строки меньше

                                  ; 8, то вывести сообщение

                                  ; об ошибке

   .ERROR         ; STRING STR TOO SHORT

   .ENDC

   .ENDM  SIZE

       Макровызовы и макрорасширения:

          SIZE    DISK

          .IF GREATER     8-4

  %MACRO-E-GENERR, GENERATED ERROR: STRING DISK TOO SHORT

          .ENDC





                           - 207 -

                        00152-01 35 01


          SIZE    INTERRUPT

          .IF GREATER     8-9

          .ERROR          ; STRING INTERRUPT TOO SHORT

          .ENDC

       При первом макровызове будет напечатано  сообщение  об

  ошибке, а при втором - нет.



       6.1.7.2. Операция %LOCATE


       Операция %LOCATE определяет местонахождение  фрагмента

  строки символов. Если операция %LOCATE  осуществляет  поиск

  совпадающего фрагмента строки символов, то  она  возвращает

  информацию о позиции первого символа  совпадения  в  строке

  символов. Например, значение операции %LOCATE(<D>,<ABCDEF>)

  равно трем. Заметьте, что первая символьная позиция в стро-

  ке обозначается нулем. Если операция %LOCATE  не  осуществ-

  ляет поиск совпадения, она возвращает значение, равное дли-

  не указанной строки символов. Например,  значение  операции

  %LOCATE (<Z>,<ABCDEF>) равно шести.

       Операция %LOCATE определяет числовое значение, которое

  может быть использовано в любом выражении.

       Формат

       %LOCATE(строка1,строка2[,символ])

       Параметры

  строка1

       - строка символов, являющаяся фрагментом другой строки

         символов. Данный фрагмент может быть либо аргументом

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


                           - 208 -

                        00152-01 35 01


         между ограничителями. Ограничителями строки символов

         могут быть угловые скобки либо  одинаковые  символы,

         первому из которых предшествует уголок вверх.

  строка2

       - строка символов, в которой ищется  совпадение  фраг-

         мента. Данная строка символов может быть либо  аргу-

         ментом макрокоманды, либо строкой  символов,  заклю-

         ченной между ограничителями.  Ограничителями  строки

         символов могут быть угловые скобки  либо  одинаковые

         символы,  первому  из  которых  предшествует  уголок

         вверх.

  символ

       - необязательный символ или десятичное число,  которое

         указывает позицию  в  строке  символов  "строка2"  с

         которой макроассемблер  должен  начать  поиск.  Если

         этот  параметр  пропущен,  макроассемблер   начинает

         поиск совпадения с позиции 0 (начало  строки  симво-

         лов); данный символ должен быть абсолютным символом,

         определенным заранее, а число должно быть десятичным

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

         указания основания системы счисления.

       Пример.

       Макроопределение:

   .маCRO TEST    STR

   .IF EQUAL    %LOCATE(STR,<AABBCCDDEE>)-10

   .ERROR                    ; STR NOT IN LIST

   .ENDC




                           - 209 -

                        00152-01 35 01


   .ENDM  TEST

       Макровызовы и макрорасширения:

          TEST    BB

          .IF EQUAL       2-10

          .ERROR              ; BB NOT IN LIST

          .ENDC

          TEST    MM

          .IF EQUAL       10-10

  %MACRO-E-GENERR, GENERATED ERROR: MM NOT IN LIST

       Примечание. Если указан необязательный параметр  "сим-

  вол" поиск в строке "строка2" начинается с символьной пози-

  ции, на которую указывает данный параметр. Например, значе-

  ние операции  %LOCATE(<ACE>,<SPACE_PARAMETR>,5)  равно  15,

  поскольку после  пятой  символовой  позиции  совпадения  не

  существует.



       6.1.7.3. Операция %EXTRACT


       Операция %EXTRACT осуществляет извлечение фрагмента из

  строки символов. Эта операция  определяет  фрагмент  строки

  символов, который начинается с указанной  позиции  и  имеет

  указанный    размер.    Например,    значением     операции

  %EXTRACT(2,3,<ABCDEF>) является строка  CDE.  Отметим,  что

  первый символ строки имеет позицию 0.

       Формат

       %EXTRACT(символ1,символ2,строка)

       Параметры





                           - 210 -

                        00152-01 35 01


  символ1

       - символ  или  десятичное  число,  которое   указывает

         начальную позицию фрагмента строки символов.  Данный

         символ должен быть абсолютным и  заранее  определен-

         ным, а число должно быть десятичным числом без  зна-

         ка. Недопустимы выражения и операции указания  осно-

         вания счисления.

  символ2

       - символ или десятичное число, которое указывает длину

         фрагмента строки символов. Данный символ должен быть

         абсолютным и заранее определенным,  а  число  должно

         быть десятичным числом без знака. Недопустимы  выра-

         жения и операции указания основания системы  счисле-

         ния.

  строка

       - аргумент макрокоманды или строка символов, заключен-

         ная между  ограничителями.  Данная  строка  символов

         может быть заключена  между  угловыми  скобками  или

         между двумя одинаковыми символами, первому из  кото-

         рых предшествует уголок вверх.

       Пример.

       Макроопределение:

     .MACRO  EXTRA   ARG

     .IF EQUAL       14-%LENGTH(ARG)

     .WARN           ; MAX LENGTH

     .ENDC

     .BLKB   %EXTRACT (2,2, ARG)




                           - 211 -

                        00152-01 35 01


     .ENDM   EXTRA

       Макровызовы и макрорасширения:

   EXTRA          1985_AUGUST

   .IF EQUAL      14-11

   .WARN          ; MAX LENGTH

   .ENDC

   .BLKB          85

   EXTRA          1945_SEPTEMBER

   .IF EQUAL      14-14

  %MACRO-W-GENWRN, GENERATED WARNING: MAX LENGTH

   .ENDC

   .BLKB          45

       Примечание. Если указанная символьная  позиция  больше

  или равна  по  значению  длине  строки  символов,  операция

  %EXTRACT определяет пустую строку (в строке нет  символов).

  Если указана нулевая длина, операция %EXTRACT также опреде-

  ляет пустую строку.



       6.2. Директивы макрокоманд


       Данный подраздел посвящен подробному описанию директив

  макрокоманд.  Приводятся  форматы  директив  макрокоманд  и

  даются примеры их использования. Директивы  представлены  в

  алфавитном порядке.











                           - 212 -

                        00152-01 35 01



       .ENDM - директива конца макроопределения
       ----------------------------------------

       Директивой .ENDM завершается макроопределение.  Пример

  использования директивы .ENDM приведен в описании директивы

  .MACRO.

       Формат

       .ENDM MAкроимя

       Параметр

  мAкроимя

       - имя макрокоманды, чье определение должно быть завер-

         шено. Имя макрокоманды является необязательным пара-

         метром, однако, если оно указано, то оно должно сов-

         падать с именем макрокоманды соответствующей  дирек-

         тивы .MACRO. Имя макрокоманды  полезно  указывать  в

         директиве .ENDM для того, чтобы макроассемблер  смог

         обнаружить те макроопределения, в которых нарушились

         правила вложения.

       Примечание. Если директива .ENDM встречается вне  мак-

  роопределения, макроассемблер выводит сообщение об ошибке.


       .ENDR - директива конца блока повторений
       ----------------------------------------

       Директива .ENDR указывает на конец  блока  повторений.

  Эта директива  должна  быть  завершающим  предложением  для

  любой директивы блока  неопределенных  повторений  (.IRP  и

  .IRPC),  а  также  для  любой  директивы  блока  повторений

  (.REPEAT).






                           - 213 -

                        00152-01 35 01


       Формат

       .ENDR


       .IRP - директива блока неопределенных повторений с
       --------------------------------------------------
                          аргументами
                          -----------
       По директиве .IRP  осуществляется  замена  формального

  аргумента последовательными фактическими аргументами, кото-

  рые указаны в списке аргументов. Этот процесс замены  аргу-

  ментов протекает во время расширения тела  блока  неопреде-

  ленных повторений. На конец тела блока неопределенных  пов-

  торений указывает директива .ENDR.

       Директива .IRP аналогична макроопределению, у которого

  есть только один формальный аргумент. При каждом расширении

  тела блока повторений этот формальный  аргумент  замещается

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

  директива и ее тело кодируются построчно в пределах  исход-

  ной программы. Данный тип макроопределения и его расширение

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

  требуют другие макрокоманды, описанные в данноM разделе.

       Директива .IRP может появляться как внутри, так и  вне

  какого-то другого  макроопределения,  блока  неопределенных

  повторений, блока повторений. Правила  указания  аргументов

  директивы .IRP те же самые, что и для  указания  аргументов

  макрокоманд.

       Формат

   .IRP символ,<список аргументов>

     .

     .



                           - 214 -

                        00152-01 35 01


     .

   Блок

     .

     .

     .

   .ENDR

       Параметры

  символ

       - формальный аргумент, который  последовательно  заме-

         щается указанными фактическими аргументами из  спис-

         ка, заключенного в угловые скобки. Если  не  указано

         ни  одного  формального  аргумента,   макроассемблер

         выводит сообщение об ошибке.

  <список аргументов>

       - список фактических аргументов, заключенный в угловые

         скобки и  используемый  при  расширении  тела  блока

         неопределенных  повторений.   Фактический   аргумент

         может содержать один или  несколько  символов.  Если

         указано несколько  фактических  аргументов,  то  они

         должны  быть  разделены  допустимыми   разделителями

         (запятая, пробел, символ табуляции). Если не указано

         ни одного фактического аргумента, то не производится

         никаких действий.

  блок

       - блок исходного текста, который должен быть  повторен

         один раз для каждого фактического аргумента из спис-

         ка фактических аргументов. Этот блок может содержать




                           - 215 -

                        00152-01 35 01


         макроопределения  и  блоки   повторений.   Директива

         .MEXIT разрешена в теле этого блока.

       Пример.

       Макроопределение:

   .MACRO ALGEBRA         FNC,A1,A2,A3,A4,A5

   .NARG  CNT

   .IRP   ARG,<A5,A4,A3,A2,A1>

   .IIF   NOT_BLANK ,     ARG,    FUNCTION ARG

   .ENDR

   CALLS  #<CNT-1>,FNC

   .ENDM  ALGEBRA

       Макровызовы и макрорасширения:

   ALGEBRA        KEY,EXP,LIM,ABS,COS,SIN

   .NARG          CNT

   .IRP           ARG,<,,ABS,LIM,EXP>

   .IIF NOT_BLANK ,ARG,   FUNCTION ARG

   .ENDR

   .IIF NOT_BLANK ,       ,FUNCTION

   .IIF NOT_BLANK ,       ,FUNCTION

   .IIF NOT_BLANK ,ABS    ,FUNCTION ABS

   .IIF NOT_BLANK ,LIM    ,FUNCTION LIM

   .IIF NOT_BLANK ,EXP    ,FUNCTION EXP

   CALLS  #<CNT-1>,KEY

       В приведенном примере для  подсчета  числа  аргументов

  используется директива .NARG, а для определения, не  пропу-

  щен ли фактический аргумент,  используется  директива  .IIF

  NOT_BLANK. Если фактический аргумент пропущен, то  никакого




                           - 216 -

                        00152-01 35 01


  двоичного кода не формируется.


       .IRPC - директива начала блока неопределенных
       ---------------------------------------------
                    повторений с символами
                    ----------------------

       Директива .IRPC во всем  подобна  директиве  .IRP,  за

  исключением того, что директива .IRPC допускает подстановку

  в виде одного символа, а не в виде аргумента. В каждой ите-

  рации тела блока неопределенных повторений формальный аргу-

  мент замещается следующим символом из указанной строки.  На

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

  .ENDR.

       Формат

   .IRPC символ,<строка>

     .

     .

     .

   блок

     .

     .

     .

   .ENDR

       Параметры

  символ

       - формальный аргумент, который  последовательно  заме-

         щается указанными символами, заключенными в  угловые

         скобки. Если не указано ни одного формального  аргу-

         мента, макроассемблер выводит сообщение об ошибке.




                           - 217 -

                        00152-01 35 01


  <строка>

       - последовательность символов, заключенная  в  угловые

         скобки, которая  используется  при  расширении  тела

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

         нужны только в  том  случае,  если  строка  символов

         содержит разделительные  символы,  их  использование

         рекомендуется с целью повышения четкости программы.

  блок

       - блок исходного текста, который должен быть  повторен

         один раз для каждого символа из  списка.  Этот  блок

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

         Директива .MEXIT разрешена в теле этого блока.

       Пример.

       Макроопределение:

          .MACRO  MODE            STRING

          .NCHR   NUM,<BWLQO>

          .IRPC   SIZE,<STRING>

          .WARN   ; ADDRESS INSTRUCTION MOV'SIZE

          .ENDR

          .ENDM   MODE

       Макровызов и макрорасширение:

          MODE    <BWLQO>

          .NCHR   NUM,<BWLQO>

          .IRPC   SIZE,<BWLQO>

          .WARN   ; ADDRESS INSTRUCTION MOV'SIZE

          .ENDR

          .WARN   ; ADDRESS INSTRUCTION MOVB




                           - 218 -

                        00152-01 35 01


          .WARN   ; ADDRESS INSTRUCTION MOVW

          .WARN   ; ADDRESS INSTRUCTION MOVL

          .WARN   ; ADDRESS INSTRUCTION MOVQ

          .WARN   ; ADDRESS INSTRUCTION MOVO

       Для подсчета числа символов в фактическом аргументе  в

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


       .LIBRARY - директива библиотеки макрокоманд
       -------------------------------------------

       Директива .LIBRARY добавляет имя  к  списку  библиотек

  макрокоманд,  который  просматривается  каждый  раз,  когда

  встречается директива .MCALL или неопределенный код  опера-

  ции. Библиотеки просматриваются в порядке, обратному  тому,

  в котором они были указаны.

       Если программист опускает какие-то данные относительно

  аргумента имени библиотеки макрокоманд, то принимаются зна-

  чения по умолчанию. Устройством по умолчанию является поль-

  зовательский диск, каталогом по умолчанию является  пользо-

  вательский каталог, а типом  файла  по  умолчанию  является

  MLB.

       Рекомендуется, чтобы библиотеки указывались в  команд-

  ной строке  для  макроассемблера  с  помощью  квалификатора

  /LIBRARY, а не с помощью директивы .LIBRARY.  Использование

  директивы .LIBRARY делает затруднительным перемещение  фай-

  лов.

       Формат

       .LIBRARY имя макробиблиотеки






                           - 219 -

                        00152-01 35 01


       Параметр

  имя макробиблиотеки

       - ограниченная строка символов, которая является  спе-

         цификацией файла,  содержащего  библиотеку  макроко-

         манд.

       Пример.

   .LIBRARY   /DB1:[JOB]ARTIC/

   .LIBRARY   ?DB1:MYFILE.MLB?

   .LIBRARY   !WORK.MLB!


       .MACRO - директива начала макроопределения
       ------------------------------------------

       Директива .MACRO указывает на начало макроопределения.

  В этой директиве указываются имя макрокоманды и список фор-

  мальных аргументов. Если указанное имя совпадает  с  именем

  ранее определенной макрокоманды, то прежнее  макроопределе-

  ние уничтожается и замещается новым. За  директивой  .MACRO

  следует исходный текст, который должен быть включен в  мак-

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

  помощью директивы .ENDM.

       Имена макрокоманд не вступают в конфликт с  символами,

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

  определяемые пользователем, могут иметь совпадающие имена.

       Когда макроассемблер встречает  директиву  .MACRO,  он

  добавляет имя макрокоманды, указанное в директиве .MACRO, в

  таблицу имен макрокоманд и запоминает исходный  текст  этой

  макрокоманды (до соответствующей директивы .ENDM).  Никаких

  других действий до расширения макрокоманды не производится.




                           - 220 -

                        00152-01 35 01


       Символы из списка формальных аргументов связываются  с

  данным именем макрокоманды и их действие ограничено  преде-

  лами данного макроопределения.  По  этой  причине  символы,

  появляющиеся в списке формальных  аргументов,  могут  также

  появляться в любом месте программы.

       Формат

   .MACRO имя макрокоманды [список формальных аргументов]

     .

     .

     .

   блок

     .

     .

     .

   .ENDM имя макрокоманды

       Параметры

  имя макрокоманды

       - имя макрокоманды, которая  должна  быть  определена.

         Этим именем может быть любое разрешенное символичес-

         кое имя, длиной до 31 символа.

  [список формальных аргументов]

       - символы, разделенные запятыми. При  макровызове  эти

         символы замещаются фактическими аргументами.

  блок

       - исходный текст, который должен быть включен в макро-

         расширение.






                           - 221 -

                        00152-01 35 01


       Пример.

       Макроопределение:

          .MACRO  DEFIN

          .PSECT  MINMAX,ABS,LONG

  MIN=0

  MAX=^XFFFF

          .PSECT  DATA,NOEXE,LONG

  LIST:   .BLKB   1000

          .BLKW    100

          .BLKL   10



          .MACRO  DEFIN        ; переопределить макрокоманду

          .ENDM   DEFIN

          .ENDM   DEFIN



       Макровызовы и макрорасширения:

          DEFIN

          .PSECT  MINMAX,ABS,LONG

  MIN=0

  MAX=^XFFFF

          .PSECT  DATA,LONG,NOEXE

  LIST:   .BLKB   1000

          .BLKW   100

          .BLKL   10

          .MACRO  DEFIN

          .ENDM   DEFIN

          DEFIN           ; макрорасширение не содержит




                           - 222 -

                        00152-01 35 01


                          ; исходного текста

       В данном примере макрокоманда, вызванная в первый раз,

  определяет некоторые символы и области хранения  данных,  а

  также в конце переопределяет себя. Поэтому при вызове  дан-

  ной макрокоманды во второй раз, макрорасширение не содержит

  никакого исходного текста.

       Примечания:

       1. Если совпадает имена макрокоманды и кода инструкции

  ЭВМ СМ 1700, то вместо инструкции используется  макрокоман-

  да. Данное свойство позволяет программисту временно переоп-

  ределить код инструкции.

       2. Если совпадают имена макрокоманды и кода инструкции

  ЭВМ СМ 1700, и при этом данная  макрокоманда  содержится  в

  библиотеке макрокоманд, то для определения этой макрокоман-

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

  противном случае программа макроассемблер не будет просмат-

  ривать библиотеки макрокоманд, так как  данный  символ  уже

  определен (как код инструкции).

       3. Во времф трансляции программист  может  переопреде-

  лить исходный  текст  макрокоманды  путем  указания  второй

  директивы .MACRO с тем же самым именем макрокоманды.  Путем

  включения второй директивы .MACRO в исходное макроопределе-

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

  вом ее вызове. Это особенно удобно при  установке  исходных

  значений или при определении символов с помощью макрокоман-

  ды, то есть когда нужное действие выполняется  только  один

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




                           - 223 -

                        00152-01 35 01


  текст в макрокоманде или же полностью удалить всю  макроко-

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

  тива .MDELETE.


       .MCALL - директива вызова макрокоманд
       -------------------------------------

       В директиве .MCALL указываются имена  системных  и/или

  определенных пользователем макрокоманд,  которые  требуются

  для трансляции  исходной  программы,  но  не  определены  в

  исходном файле.

       Если какое-то имя макрокоманды не найдено по  заверше-

  нию поиска (то есть, если данная макрокоманда не определена

  в какой-либо из библиотек макрокоманд), то выводится  сооб-

  щение об ошибке.

       Формат

       .MCALL список макрокоманд

       Параметр

  список макрокоманд

       - список макрокоманд, которые должны быть определены в

         данном процессе трансляции. Имена макрокоманд должны

         быть разделены запятыми.

       Пример.

   .MCALL SPANC   ; инструкцию SPANC заменить

                  ; макрокомандой из библиотеки

       Примечание. Директива  .MCALL  обеспечивает  совмести-

  мость с языком макроассемблер для см 4, однако не  рекомен-

  дуется этим пользоваться.  Когда  программа  макроассемблер

  находит неизвестный символ в поле инструкции, он  автомати-




                           - 224 -

                        00152-01 35 01


  чески производит поиск этого символа  во  всех  библиотеках

  макрокоманд. Если этот символ обнаруживается в  библиотеке,

  то программа макроассемблер использует соответствующее мак-

  роопределение и производит расширение ссылки на макрокоман-

  ду. Если же программа макроассемблер не обнаруживает  неиз-

  вестный символ в библиотеке, выводится сообщение об ошибке.

  Существует одно исключение, когда директива  .MCALL  обяза-

  тельно должна быть использована. Это нужно  в  том  случае,

  если макрокоманда и код инструкции имеют одинаковое имя.


       .MDELETE - директива удаления макрокоманды
       ------------------------------------------

       Директива .MDELETE производит удаление  макроопределе-

  ний  для  указанных   макрокоманд.   Количество   удаленных

  Mакрокоманд печатается в листинге трансляции в той же самой

  строке, в которой указана директива .MDELETE.

       Директива  .MDELETE  полностью  удаляет  макрокоманду,

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

  ределения макрокоманды,  описанный  для  директивы  .MACRO,

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

       Формат

       .MDELETE список макрокоманд

       Параметр

  список макрокоманд

       - список имен  маKрокоманд,  макроопределения  которых

         подлежат удалению.  Имена  макрокоманд  должны  быть

         разделены запятыми.






                           - 225 -

                        00152-01 35 01


       Пример.

   .MDELETE       LINE,TIME,$BASE


       .MEXIT - директива выхода из макрокоманды
       -----------------------------------------

       Директива .MEXIT завершает  макрорасширение  до  того,

  как наступит конец макрокоманды. Завершение макрорасширения

  при этом ничем не отличается от  завершения,  когда  встре-

  чается директива .ENDM. Данная директива может быть исполь-

  зована также и в теле блока  повторений.  Директива  .MEXIT

  особенно полезна при условном расширении макрокоманд,  пос-

  кольку она позволяет обходить сложности вложенных  условных

  директив и изменять направления трансляции.

       Формат

       .MEXIT

       Пример.

   .MACRO TAPE    N,A,B

     .

     .

   .IF EQ         N    ; начало блока условной трансляции

     .

     .

   .MEXIT              ; завершение макрорасширения

   .ENDC               ; и конец блока условной трансляции

     .

     .

   .ENDM  ТAPE         ; нормальный конец макрокоманды

       В данном примере, в случае, если фактическое  значение




                           - 226 -

                        00152-01 35 01


  формального аргумента N было бы равно нулю, то блок  услов-

  ной трансляции был бы странслирован и  данная  макрокоманда

  завершилась бы по директиве .MEXIT.

       Примечания:

       1. Если директива .MEXIT появляется в  блоке  повторе-

  ний, то программа макроассемблер завершает текущее повторе-

  ние тела блока и подавляет дальнейшее расширение тела блока

  повторений.

       2. Если макрокоманды и блоки повторений являются  вло-

  женными, то директива .MEXIT вызывает переход к макрорасши-

  рению более высокого уровня.

       3. Если дирекива  .MEXIT возникает независимо от  мак-

  роопределения или блока повторений, то выводится  сообщение

  об ошибке.


       .NARG - директива определения количества аргументов
       ---------------------------------------------------

       Директива .NARG  определяет  количество  аргументов  в

  текущем макровызове.

       Директива    .NARG     производит     подсчет     всех

  позиционно-зависимых аргументов, указанных  в  макровызове,

  включая пустые аргументы (они обозначаются двумя  соседними

  запятыми). В значение, присваиваемое указанному символу, не

  входит ни количество аргументов в виде  ключевых  слов,  ни

  количество аргументов, имеющих значение по умолчанию.

       Формат

       .NARG символ






                           - 227 -

                        00152-01 35 01


       Параметр

  символ

       - символ,  которому  присваивается  значение,   равное

         количеству аргументов в макровызове.

       Пример.

       Макроопределение:

   .MACRO ACCOUNT         ; A,B,C,D=ABC,D=DEF

   .NARG  CNT             ; подсчет числа аргументов

   .WORD  CNT             ; сохранить в CNT значение

                          ; числа аргументов

   .ENDM  ACCOUNT

       Макровызовы и макрорасширения:

    ACCOUNT MAR,APR,MAY   ; значение счетчика будет 3

    .NARG   CNT

    .WORD   CNT



    ACCOUNT               ; значение счетчика будет 0

    .NARG   CNT

    .WORD   CNT



    ACCOUNT MAR,APR=30,MAY=31    ; значение счетчика

    .NARG   CNT                  ; будет 1

    .WORD   CNT



    ACCOUNT JUNE,JULE,,,  ; значение счетчика будет 5

    .NARG   CNT

    .WORD   CNT




                           - 228 -

                        00152-01 35 01


       Примечание. Если директива .NARG появляется вне макро-

  команды,  программа  макроассемблер  выводит  сообщение  об

  ошибке.


       .NCHR - директива определения количества символов
       -------------------------------------------------

       Директива .NCHR определяет количество символов в  ука-

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

  любом месте программы, написанной на языке  макроассемблер,

  и оказывается полезной при вычислении длины аргументов мак-

  рокоманд.

       Формат

       .NCHR символ,<строка>

       Параметры

  символ

       - символ,  которому  присваивается  значение,   равное

         количеству символов в указанной строке символов.

  <строка>

       - последовательность печатных символов. Данная  строка

         символов должна быть  ограничена  угловыми  скобками

         или двумя одинаковыми символами, первому из  которых

         предшествует уголок вверх, причем лишь в том случае,

         если указанная строка символов содержит  разрешенные

         разделительные  символы  (запятая,  пробел,   символ

         табуляции) или точку с запятой.










                           - 229 -

                        00152-01 35 01


       Пример.

       Макроопределение:

   .MACRO COUNT   STRING

   .NCHR  CNT,<STRING>

   .WORD  CNT

   .ASCIZ /STRING/

   .ENDM  COUNT

       Макровызовы и макрорасширения:

   COUNT   <SOVIET UNION>

   .NCHR   CNT,<SOVIET UNION>     ; значение счетчика

   .WORD   CNт                    ; будет равно 12

   .ASCIZ  /SOVIET UNION/


       .NTYPE - директива определения режима адресации
       -----------------------------------------------

       Директива .NTYPE определяет режим адресации  для  ука-

  занного операнда.

       Значение символа устанавливается соответствующим обра-

  зом для определенного адресного режима. В большинстве  слу-

  чаев возвращается 8-разрядное значение  (1  байт).  Разряды

  0...3 указывают на регистр, который связан с данным режимом

  адресации, а разряды 4...7 указывают  на  режим  адресации.

  Для обеспечения сжатой формы информации об адресации разря-

  ды 4...7 не точно воспроизводят то числовое значение, прис-

  военное определенному режиму адресации (приложение 2, табл.

  6). В частности, литеральный  режим  обозначается  нулем  в

  разрядах 4...7, вместо значений 0...3  (см.  Приложение  2,

  табл. 6). Режим 1  указывает  на  операнд  непосредственной




                           - 230 -

                        00152-01 35 01


  адресации, режим 2 указывает на операнд абсолютной  адреса-

  ции, а режим 3 указывает на операнд адресации общего вида.

       Для адресации с индексацией определяется  16-разрядное

  значение (2 байта).  Старший  байт  содержит  номер  режима

  адресации для базового операнда, а  младший  байт  содержит

  номер  режима  адресации  первичного  операнда   (индексный

  регистр).

       Формат

       .NTYPE символ,Oперанд

       Параметр

  символ

       - любой разрешенный символ. Данному  символу  присваи-

         вается значение, равное 8- или 16-разрядному  указа-

         телю режима адресации для операнда, который  следует

         далее в качестве аргумента директивы.

  операнд

       - любое разрешенное адресное  выражение,  что  исполь-

         зуется вместе с кодом инструкции. Если "операнд"  не

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












                           - 231 -

                        00152-01 35 01


       Пример.

       Макроопределение:

   ; макрокоманда PUSHADR используется для помещения адреса

   ; в стек. Она осуществляет проверку типа операнда (путем

   ; использования директивы .NTYPE) с целью определения,

   ; является ли операнд адресом. Если операнд не является

   ; адресом, данная макрокоманда просто помещает аргумент

   ; в стек и формирует предупреждающее сообщение.

     .MACRO  PUSHADR ADDR

     .NTYPE  A,ADDR

  A = A@-4&^XF

     .IF IDENTICAL   0,<ADDR>

     PUSHL   #0

     .MEXIT

     .ENDC

  ERR = 0

     IIF LESS_EQUAL A-1, ERR=1

     .IIF EQUAL A-5, ERR=1

     .IF EQUAL  ERR

     PUSHAL  ADDR

     .IFF

     PUSHL   ADDR

     .WARN   ; ADDR IS NOT AN ADDRESS

     .ENDC

     .ENDM   PUSHADR








                           - 232 -

                        00152-01 35 01


       Макровызовы и макрорасширения:

     PUSHADR (R0)

     PUSHL   (R0)

     PUSHADR (R1) [R4]

     PUSHAL  (R1) [R4]

     PUSHADR 0

     PUSHL   #0

     PUSHADR #1

     PUSHL   #1

  %MACRO-W-GENWRN, GENERATED WARNING: #1 IS NOT AN ADDRESS

     PUSHADR R0

     PUSHL   R0

  %MACRO-W-GENWRN, GENERATED WARNING: R0 IS NOT AN ADDRESS


       .REPEAT - директива начала блока повторений
       -------------------------------------------

       По  директиве  .REPEAT  выполняется  повторение  блока

  исходного текста программы указанное количество раз.  Такое

  повторение выполняется последовательно с остальным исходным

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

  директивы .ENDR.

       Формат

   .REPEAT выражение

     .

     .

     .

   блок

     .




                           - 233 -

                        00152-01 35 01


     .

     .

   .ENDR

       Параметры

  выражение

       - значение данного  выражения  определяет  число  раз,

         которое должен транслироваться  в  программе  данный

         блок. Если значение  данного  выражения  меньше  или

         равно нулю, блок повторений не транслируется. Данное

         выражение не должно содержать никаких неопределенных

         символов и должно быть абсолютным.

  блок

       - исходный текст, который должен быть повторен.  Число

         повторений определяется значением выражения, указан-

         ного в  директиве  .REPEAT.  Блок  повторений  может

         содержать  макроопределения,  блоки   неопределенных

         повторений  и  другие  блоки  повторений.  Допустимо

         использование в блоке повторений директивы .MEXIT.

       Пример.

       Макроопределение:

   .MACRO COPY    STRING,NUM

   .REPEAT NUM

   .ASCII /STRING/

   .ENDR

   .WORD  0

   .ENDM  COPY






                           - 234 -

                        00152-01 35 01


       Макровызовы и макрорасширения:

   COPY    <WHAT'S YOUR NAME?>,4

   .REPEAT 4

   .ASCII  /WHAT'S YOUR NAME?/

   .ENDR

   .ASCII  /WHAT'S YOUR NAME?/

   .ASCII  /WHAT'S YOUR NAME?/

   .ASCII  /WHAT'S YOUR NAME?/

   .ASCII  /WHAT'S YOUR NAME?/

       Примечание. Альтернативной  формой  директивы  .REPEAT

  является директива .REPT.

























                           - 235 -

                        00152-01 35 01


                                                 Приложение 1





         Таблица кодов инструкций




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

  которые программа макроассемблер распознает  автоматически.

  В таблице приводятся коды инструкций в алфавитном порядке.

       Подробное описание системы инструкций  представлено  в

  документе [2].


            Коды инструкций (в алфавитном порядке)

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

  9D               ! ACBB        ! Сложение  байтов,  сравне-

                   !             ! ние и переход

  6F               ! ACBD        ! Сложение, сравнение и  пе-

                   !             ! реход для данных формата D

  4F               ! ACBF        ! Сложение, сравнение и  пе-

                   !             ! реход для данных формата F

  4FFD             ! ACBG        ! Сложение, сравнение и  пе-

                   !             ! реход для данных формата G

  6FFD             ! ACBH        ! Сложение, сравнение и  пе-

                   !             ! реход для данных формата H




                           - 236 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

  F1               ! ACBL        ! Сложение   длинных   слов,

                   !             ! сравнение и переход

  3D               ! ACBW        ! Сложение  слов,  сравнение

                   !             ! и переход

  58               ! ADAWI       ! Блокированное сложение вы-

                   !             ! ровненных слов

  80               ! ADDB2       ! Сложение байтов, 2 операн-

                   !             ! да

  81               ! ADDB3       ! Сложение байтов, 3 операн-

                   !             ! да

  60               ! ADDD2       ! Сложение данных формата D,

                   !             ! участвуют 2 операнда

  61               ! ADDD3       ! Сложение данных формата D,

                   !             ! участвуют 3 операнда

  40               ! ADDF2       ! Сложение данных формата F,

                   !             ! участвуют 2 операнда

  41               ! ADDF3       ! Сложение данных формата F,

                   !             ! участвуют 3 операнда

  40FD             ! ADDG2       ! Сложение данных формата G,

                   !             ! участвуют 2 операнда

  41FD             ! ADDG3       ! Сложение данных формата G,

                   !             ! участвуют 3 операнда




                           - 237 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

  60FD             ! ADDH2       ! Сложение данных формата H,

                   !             ! участвуют 2 операнда

  61FD             ! ADDH3       ! Сложение данных формата H,

                   !             ! участвуют 3 операнда

  C0               ! аDDL2       ! Сложение   длинных   слов,

                   !             ! участвуют 2 операнда

  C1               ! ADDL3       ! Сложение   длинных   слов,

                   !             ! участвуют 3 операнда

  20               ! ADDP4       ! Сложение  данных  в упако-

                   !             ! ванном формате,  участвуют

                   !             ! 4  операнда

  21               ! ADDP6       ! Сложение данных  в  упако-

                   !             ! ванном формате,  участвуют

                   !             ! 6 операндов

  A0               ! ADDW2       ! Сложение слов, участвуют 2

                   !             ! операнда

  а1               ! ADDW3       ! Сложение слов, участвуют 3

                   !             ! операнда

  D8               ! ADWC        ! Сложение с переносом

  F3               ! аоBLEQ      ! прибавление единицы  и пе-

                   !             ! реход по меньше  или равно

  F2               ! AOBLSS      ! Прибавление  единицы и пе-




                           - 238 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

                   !             ! реход по меньше

  78               ! ASHL        ! Арифметический сдвиг длин-

                   !             ! ного слова

  F8               ! аSHP        ! Арифметический сдвиг и ок-

                   !             ! ругление данных в упакова-

                   !             ! нном формате

  79               ! ASHQ        ! Арифметический сдвиг

                   !             ! квадрослова

  E1               ! BBC         ! Переход по сбросу разряда

  E5               ! BBCC        ! переход по сбросу разряда

                   !             ! и сброс

  E7               ! BBCCI       ! Блокированный переход по

                   !             ! сбросу разряда и сброс

  E3               ! BBCS        ! Переход по сбросу разряда

                   !             ! и установка

  E0               ! BBS         ! Переход по установке раз-

                   !             ! ряда

  E4               ! BBSC        ! Переход по установке раз-

                   !             ! ряда и сброс

  E2               ! BBSS        ! Переход по установке раз-

                   !             ! ряда и установка

  E6               ! BBSSI       ! Блокированный переход по




                           - 239 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

                   !             ! установке разряда и уста-

                   !             ! новка

  1E               ! BCC         ! Переход по сброшенному би-

                   !             ! ту переноса

  1F               ! BCS         ! Переход по установленному

                   !             ! биту переноса

  13               ! BEQL        ! Переход по равенству

  13               ! BEQLU       ! Переход по равенству (без

                   !             ! знака)

  18               ! BGEQ        ! Переход по больше или рав-

                   !             ! но

  1E               ! вGEQU       ! Переход по больше или рав-

                   !             ! но (без знака)

  14               ! BGTR        ! Переход по больше

  1A               ! BGTRU       ! Переход по больше (без

                   !             ! знака)

  8A               ! BICB2       ! Очистка разрядов в байте,

                   !             ! участвуют 2 операнда

  8B               ! BICB3       ! Очистка разрядов в байте,

                   !             ! участвуют 3 операнда

  CA               ! BICL2       ! Очистка разрядов в длинном

                   !             ! слове, участвуют 2 операн-




                           - 240 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

                   !             ! да

  CB               !  BICL3      ! Очистка разрядов в длинном

                   !             ! слове, участвуют 3 операн-

                   !             ! да

  B9               ! BICPSW      ! Очистка разрядов в слове

                   !             ! состояния программы

  AA               ! BICW2       ! Очистка разрядов в слове,

                   !             ! участвуют 2 операнда

  AB               ! BICW3       ! Очистка разрядов в слове,

                   !             ! участвуют 3 операнда

  88               ! BISB2       ! Установка разрядов в байте

                   !             ! участвуют 2 операнда

  89               ! BISB3       ! Установка разрядов в байте

                   !             ! участвуют 3 операнда

  C8               ! BISL2       ! Установка разрядов в длин-

                   !             ! ном слове, участвуют 2

                   !             ! операнда

  C9               ! BISL3       ! Установка разрядов в длин-

                   !             ! ном слове, участвуют 3

                   !             ! операнда

  B8               ! BISPSW      ! Установка разрядов в слове

                   !             ! состояния программы




                           - 241 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

  A8               ! BISW2       ! Установка разрядов в слове

                   !             ! участвуют 2 операнда

  A9               ! BISW3       ! Установка разрядов в слове

                   !             ! участвуют 3 операнда

  93               ! BITB        ! Проверка разрядов в байте

  D3               ! BITL        ! Проверка разрядов в длин-

                   !             ! ном слове

  B3               ! BITW        ! Проверка разрядов в слове

  E9               ! BLBC        ! Переход по сбросу младшего

                   !             ! разряда

  E8               ! BLBS        ! Переход по установке млад-

                   !             ! шего разряда

  15               ! BLEQ        ! Переход по меньше или рав-

                   !             ! но

  1B               ! BLEQU       ! Переход по меньше или рав-

                   !             ! но (без знака)

  19               ! BLSS        ! Переход по меньше

  1F               ! BLSSU       ! Переход по меньше (без

                   !             ! знака)

  12               ! BNEQ        ! Переход по неравенству

  12               ! BNEQU       ! Переход по неравенству

                   !             ! (без знака)




                           - 242 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

  03               ! BPT         ! Внутреннее прерывание по

                   !             ! точке останова

  11               ! BRB         ! Безусловный переход с

                   !             ! смещением в байте

  31               ! BRW         ! Безусловный переход со

                   !             ! смещением в слове

  10               ! BSBB        ! Переход на подпрограмму с

                   !             ! смещением в байте

  30               ! BSBW        ! Переход на подпрограмму со

                   !             ! смещением в слове

  1C               ! BVC         ! Переход по сбросу бита пе-

                   !             ! реполнения

  1D               ! BVS         ! Переход по установке бита

                   !             ! переполнения

  FA               ! CALLG       ! Вызов с обычным списком

                   !             ! аргумента

  FB               ! CALLS       ! Вызов с занесением в стек

  8F               ! CASEB       ! Выбор перехода со смеще-

                   !             ! нием в байте

  CF               ! CASEL       ! Выбор перехода со смеще-

                   !             ! нием в длинном слове

  AF               ! CASEW       ! Выбор перехода со смеще-




                           - 243 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

                   !             ! нием в слове

  BD               ! CHME        ! Изменить режим на управ-

                   !             ! ляющую программу

  BC               ! CHMK        ! Изменить режим на ядро

  BE               ! CHMS        ! Изменить режим на суперви-

                   !             ! зор

  BF               ! CHMU        ! Изменить режим на пользо-

                   !             ! вательский

  94               ! CLRB        ! Очистить байт

  7C               ! CLRD        ! Очистить данное формата D

  DF               ! CLRF        ! Очистить данное формата F

  7C               ! CLRG        ! Очистить данное формата G

  7CFD             ! CLRH        ! Очистить данное формата H

  D4               ! CLRL        ! Очистить длинное слово

  7CFD             ! CLRO        ! Очистить октаслово

  7C               ! CLRQ        ! Очистить квадрослово

  B4               ! CLRW        ! Очистить слово

  91               ! CMPB        ! Сравнение байтов

  29               ! CMPC3       ! Сравнение символов, участ-

                   !             ! вуют 3 операнда

  2D               ! CMPC5       ! Сравнение символов, участ-

                   !             ! вуют 5 операндов




                           - 244 -

                        00152-01 35 01


                                                   Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

  71               ! CMPD        ! Сравнение данных формата D

  51               ! CMPF        ! Сравнение данных формата F
                                   
  51FD             ! CMPG        ! Сравнение данных формата G

  71FD             ! CMPH        ! Сравнение данных формата H

  D1               ! CMPL        ! Сравнение длинных слов

  35               ! CMPP3       ! Сравнение данных упакован-

                   !             ! ного формата, участвуют 3

                   !             ! операнда

  37               ! CMPP4       ! Сравнение данных упакован-

                   !             ! ного формата, участвуют 4

                   !             ! операнда

  EC               ! CMPV        ! Сравнение полей

  BI               ! CMPW        ! Сравнение слов

  ED               ! CMPZV       ! Сравнение полей с рас-

                   !             ! пространением нуля

  OB               ! CRC         ! Расчитать циклическую

                   !             ! проверку на избыточность

  6C               ! CVTBD       ! Преобразовать байт в фор-

                   !             ! мат D

  4C               ! CVTBF       ! Преобразовать байт в фор-

                   !             ! мат F

  4CFD             ! CVTBG       ! Преобразовать байт в фор-




                           - 245 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

                   !             ! мат G

  6CFD             ! сVTBH       ! Преобразовать байт в фор-

                   !             ! мат H

  98               ! CVTBL       ! Преобразовать байт в

                   !             ! длинное слово

  99               ! CVTBW       ! Преобразовать байт в слово

  68               ! CVTDB       ! Преобразовать формат D

                   !             ! в байт

  76               ! CVTDF       ! Преобразовать формат D

                   !             ! в формат F

  32FD             ! CVTDH       ! Преобразовать формат D

                   !             ! в формат H

  6A               ! CVTDL       ! Преобразовать формат D

                   !             ! в длинное слово

  69               ! CVTDW       ! Преобразовать формат D

                   !             ! в слово

  48               ! CVTFB       ! Преобразовать формат F

                   !             ! в байт

  56               ! CVTFD       ! Преобразовать формат F

                   !             ! в формат D

  99FD             ! CVTFG       ! Преобразовать формат F

                   !             ! в формат H




                           - 246 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

  4A               ! CVTFL       ! Преобразовать формат F

                   !             ! в длинное слово

  49               ! CVTFW       ! Преобразовать формат F

                   !             ! в слово

  48FD             ! CVTGB       ! Преобразовать формат G

                   !             ! в байт

  33FD             ! CVTGF       ! Преобразовать формат G
                                   
                   !             ! в формат F

  56FD             ! CVTGH       ! Преобразовать формат G

                   !             ! в формат H

  4AFD             ! CVTGL       ! Преобразовать формат G

                   !             ! в длинное слово

  49FD             ! CVTGW       ! Преобразовать формат G

                   !             ! в слово

  68FD             ! CVTHB       ! Преобразовать формат H

                   !             ! в байт

  F7FD             ! CVTHD       ! Преобразовать формат H

                   !             ! в формат D

  F6FD             ! CVTHF       ! Преобразовать формат H

                   !             ! в формат F

  76FD             ! CVTHG       ! Преобразовать формат H

                   !             ! в формат G




                           - 247 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

  6AFD             ! CVTHL       ! Преобразовать формат H

                   !             ! в длинное слово

  69FD             ! CVTHW       ! Преобразовать формат H

                   !             ! в слово

  F6               ! CVTLB       ! Преобразовать длинное сло-

                   !             ! во в байт

  6E               ! CVTLD       ! Преобразовать длинное сло-

                   !             ! во в байт

  4E               ! CVTLF       ! Преобразовать длинное сло-

                   !             ! во в формат F

  4EFD             ! CVTLG       ! Преобразовать длинное сло-

                   !             ! во в формат G

  6EFD             ! CVTLH       ! Преобразовать длинное сло-

                   !             ! во в формат H

  F9               ! CVTLP       ! Преобразовать длинное сло-

                   !             ! во в упакованный формат

  F7               ! CVTLW       ! Преобразовать длинное сло-

                   !             ! во в слово

  36               ! CVTPL       ! Преобразовать упакованный

                   !             ! формат в длинное слово

  08               ! CVTPS       ! Преобразовать упакованный

                   !             ! формат в формат с ведущим




                           - 248 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

                   !             ! разделителем

  24               ! CVTPT       ! Преобразовать упакованный

                   !             ! формат в формат с остатком

  6B               ! CVTRDL      ! Преобразовать формат D в

                   !             ! длинное слово (с округле-

                   !             ! нием)

  4B               ! CVTRFL      ! Преобразовать формат F в

                   !             ! длинное слово (с округле-

                   !             ! нием)

  4BFG             ! CVTRGL      ! Преобразовать формат G в

                   !             ! длинное слово (с округле-

                   !             ! нием)

  6BFD             ! CVTRHL      ! Преобразовать формат H в

                   !             ! длинное слово (с округле-

                   !             ! нием)

  09               ! CVTSP       ! Преобразовать формат с ве-

                   !             ! дущими разделителями в

                   !             ! упакованный формат

  26               ! CVTTP       ! Преобразовать формат с

                   !             ! остатком в упакованный

                   !             ! формат

  33               ! CVTWB       ! Преобразовать слово в байт




                           - 249 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

  6D               ! CVTWD       ! Преобразовать слово в фор-

                   !             ! мат D

  4D               ! CVTWF       ! Преобразовать слово в фор-

                   !             ! мат F

  4DFD             ! CVTWG       ! Преобразовать слово в фор-

                   !             ! мат G

  6DFD             ! CVTWH       ! Преобразовать слово в фор-

                   !             ! мат H

  32               ! CVTWL       ! Преобразовать слово в

                   !             ! длинное слово

  97               ! DECB        ! Уменьшение байта на 1

  B7               ! DECW        ! Уменьшение слова на 1

  86               ! DIVB2       ! Деление байтов, участвуют

                   !             ! 2 операнда

  87               ! DIVB3       ! Деление байтов, участвуют

                   !             ! 3 операнда

  66               ! DIVD2       ! Деление данных формата D,

                   !             ! участвуют 2 операнда

  67               ! DIVD3       ! Деление данных формата D,

                   !             ! участвуют 3 операнда

  46               ! DIVF2       ! Деление данных формата F,

                   !             ! участвуют 2 операнда




                           - 250 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

  47               ! DIVF3       ! Деление данных формата F,

                   !             ! участвуют 3 операнда

  46FD             ! DIVG2       ! Деление данных формата G,

                   !             ! участвуют 2 операнда

  47FD             ! DIVG3       ! Деление данных формата G,

                   !             ! участвуют 3 операнда

  66FD             ! DIVH2       ! Деление данных формата H,

                   !             ! участвуют 2 операнда

  67FD             ! DIVH3       ! Деление данных формата H,

                   !             ! участвуют 3 операнда

  C6               ! DIVL2       ! Деление длинных слов,

                   !             ! участвуют 2 операнда

  C7               ! DIVL3       ! Деление длинных слов,

                   !             ! участвуют 3 операнда

  27               ! DIVP        ! Деление данных в упакован-

                   !             ! ном формате

  A6               ! DIVW2       ! Деление слов, участвуют 2

                   !             ! операнда

  A7               ! DIVW3       ! Деление слов, участвуют 3

                   !             ! операнда

  38               ! EDITPC      ! Редактирование упакован-

                   !             ! ного формата в символь-




                           - 251 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

                   !             ! ную строку

  7B               ! EDIV        ! Расширенное деление

  74               ! EMODD       ! Расширенное умножение с

                   !             ! выделением целой части

                   !             ! формата D

  54               ! EMODF       ! Расширенное умножение с

                   !             ! выделением целой части

                   !             ! формата F

  54FD             ! EMODG       ! Расширенное умножение с

                   !             ! выделением целой части

                   !             ! формата G

  74FD             ! EMODH       ! Расширенное умножение с

                   !             ! выделением целой части

                   !             ! формата H

  7A               ! EMUL        ! Расширенное умножение

  EE               ! EXTV        ! Выделение битового поля

  EF               ! EXTZV       ! Выделение битового поля

                   !             ! с распространением нуля

  ев               ! FFC         ! Нахождение первого сбро-

                   !             ! шенного разряда

  EA               ! FFS         ! Нахождение первого уста-

                   !             ! новленного разряда




                           - 252 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

  00               ! HALT        ! Останов

  96               ! INCB        ! Увеличение байта на 1

  D6               ! INCL        ! Увеличение длинного слова

                   !             ! на 1

  B6               ! INCW        ! Увеличение слова на 1

  0A               ! INDEX       ! Вычисление указателя

  5C               ! INSQHI      ! Блокированное включение в

                   !             ! начало очереди

  5D               ! INSQTI      ! Блокированное включение в

                   !             ! конец очереди

  0E               ! IHSQUE      ! Включение в очередь

  F0               ! IHSV        ! Включение битового поля

  17               ! JMP         ! Переход

  16               ! JSB         ! Переход на подпрограмму

  O6               ! LDPCTX      ! Загрузка контекста прог-

                   !             ! раммы

  3A               ! LOCC        ! Определить местонахождение

                   !             ! символа

  39               ! MATCHC      ! Сравнить символы на совпа-

                   !             ! дение

  92               ! MCOMB       ! Переслать байт в дополни-

                   !             ! тельном коде




                           - 253 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

  D2               ! MCOML       ! Переслать длинное слово в

                   !             ! дополнительном коде

  B2               ! MCOMW       ! Переслать слово в дополни-

                   !             ! тельном коде

  DB               ! MFPR        ! Переслать из регистра про-

                   !             ! цессора

  8E               ! MNEGB       ! Переслать байт с отрицани-

                   !             ! ем

  72               ! MNEGD       ! Переслать данное формата

                   !             ! D с отрицанием

  52               ! MNECF       ! Переслать данное формата

                   !             ! F с отрицанием

  52FD             ! MNEGG       ! Переслать данное формата

                   !             ! G с отрицанием

  72FD             ! MNEGH       ! Переслать данное формата

                   !             ! H с отрицанием

  CE               ! MNEGL       ! Переслать длинное слово с

                   !             ! отрицанием

  AE               ! MNEGW       ! Переслать слово с отрица-

                   !             ! нием

  9E               ! MOVAB       ! Переслать адрес байта

  7E               ! MOVAD       ! Переслать адрес данного




                           - 254 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

                   !             ! формата D

  DE               ! MOVAF       ! Переслать адрес данного

                   !             ! формата F

  7E               ! MOVAG       ! Переслать адрес данного

                   !             ! формата G

  7EFD             ! MOVAH       ! Переслать адрес данного

                   !             ! формата H

  DE               ! MOVAL       ! Переслать адрес длинного

                   !             ! слова

  7EFD             ! MOVAO       ! Переслать адрес октаслова

  7E               ! MOVAQ       ! Переслать адрес квадро-

                   !             ! слова

  3E               ! MOVAW       ! Переслать адрес слова

  90               ! MOVB        ! Переслать байт

  28               ! MOVC3       ! Переслать символы, участ-

                   !             ! вуют 3 операнда

  2C               ! MOVC5       ! Переслать символы, участ-

                   !             ! вуют 5 операндов

  70               ! MOVD        ! Переслать данное формата D

  50               ! MOVF        ! Переслать данное формата F

  50FD             ! MOVG        ! Переслать данное формата G

  70FD             ! MOVH        ! Переслать данное формата H




                           - 255 -

                        00152-01 35 01

                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

  DO               ! MOVL        ! Переслать длинное слово

  7DFD             ! MOVO        ! Переслать октаслово

  34               ! MOVP        ! Переслать данные упакован-

                   !             ! ного вида

  DC               ! MOVPSL      ! Переслать длинное слово

                   !             ! состояния программы

  7D               ! MOVQ        ! Переслать квадрослово

  2E               ! MOVTC       ! Переслать транслированные

                   !             ! символы

  2F               ! MOVTUC      ! Переслать транслированные

                   !             ! символы до символа

  BO               ! MOVW        ! Переслать слово

  OA               ! MOVZBL      ! Переслать байт в длинное

                   !             ! слово с распространением

                   !             ! нуля

  9B               ! MOVZBW      ! Переслать байт в слово с

                   !             ! распространением нуля

  3C               ! MOVZWL      ! Переслать слово в длинное

                   !             ! слово с распространением

                   !             ! нуля

  DA               ! MTPR        ! Переслать в регистр про-

                   !             ! цессора




                           - 256 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

  84               ! MULB2       ! Умножение байтов,

                   !             ! участвуют 2 операнда

  85               ! MULB3       ! Умножение байтов,

                   !             ! участвуют 3 операнда

  64               ! MULD2       ! Умножение данных формата D

                   !             ! участвуют 2 Oперанда

  65               ! MULD3       ! Умножение данных формата D

                   !             ! участвуют 3 Oперанда

  44               ! MULF2       ! Умножение данных формата F

                   !             ! участвуют 2 Oперанда

  45               ! MULF3       ! Умножение данных формата F

                   !             ! участвуют 3 Oперанда

  44FD             ! MULG2       ! Умножение данных формата G

                   !             ! участвуют 2 Oперанда

  45FD             ! MULG3       ! Умножение данных формата G

                   !             ! участвуют 3 Oперанда

  64FD             ! MULH2       ! Умножение данных формата H

                   !             ! участвуют 2 Oперанда

  65FD             ! MULH3       ! Умножение данных формата H

                   !             ! участвуют 3  Oперанда

  C4               ! MULL2       ! Умножение длинных слов,

                   !             ! участвуют 2 операнда




                           - 257 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

  C5               ! MULL3       ! Умножение длинных слов,

                   !             ! участвуют 3 операнда

  25               ! MULP        ! Умножение данных в

                   !             ! упакованном формате

  A4               ! MULW2       ! Умножение слов, участ-

                   !             ! вуют 2 операнда

  A5               ! MULW3       ! Умножение слов, участ-

                   !             ! вуют 3 операнда

  O1               ! NOP         ! Нет операции

  75               ! POLYD       ! Обработка многочлена

                   !             ! формата D

  55               ! POLYF       ! Обработка многочлена

                   !             ! формата F

  55FD             ! POLYG       ! Oбработка многочлена

                   !             ! формата G

  75FD             ! POLYH       ! Обработка многочлена

                   !             ! формата H

  BA               ! POPR        ! Извлечение регистров из

                   !             ! стека

  OC               ! PROBER      ! Проверить доступ для чте-

                   !             ! ния

  OD               ! PROBEW      ! Проверить доступ для запи-




                           - 258 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

                   !             ! си

  9F               ! PUSHAB      ! Записать в стек адрес

                   !             ! байта

  7F               ! PUSHAD      ! Записать в стек адрес

                   !             ! данного формата D

  DF               ! PUSHAF      ! Записать в стек адрес

                   !             ! данного формата F

  7F               ! PUSHAG      ! Записать в стек адрес

                   !             ! данного формата G

  7FFD             ! PUSHAH      ! Записать в стек адрес

                   !             ! данного формата H

  DF               ! PUSHAL      ! Записать в стек адрес

                   !             ! длинного слова

  7FFD             ! PUSHAO      ! Записать в стек адрес

                   !             ! октаслова

  7F               ! PUSHAQ      ! Записать в стек адрес

                   !             ! квадрослова

  3F               ! PUSHAW      ! Записать в стек адрес

                   !             ! слова

  DD               ! PUSHL       ! Записать в стек длинное

                   !             ! слово

  BB               ! PUSHR       ! Запись регистров в стек




                           - 259 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

  O2               ! REI         ! Возврат из исключения или

                   !             ! прерывания

  5E               ! REMQHI      ! Удаление из начала очере-

                   !             ! ди, блокированное

  5F               ! REMQTI      ! Удаление из конца очереди,

                   !             ! блокированное

  OF               ! REMQUE      ! Удаление из очереди

  O4               ! RET         ! Возврат из вызванной про-

                   !             ! цедуры

  9C               ! ROTL        ! Циклический сдвиг длинного

                   !             ! слова

  O5               ! RSB         ! Возврат из подпрограммы

  D9               ! SBWC        ! Вычитание с переносом

  2A               ! SCANC       ! Поиск символов

  3B               ! SKPC        ! Пропуск символов

  F4               ! SOBGEQ      ! Вычитание единицы и пере-

                   !             ! ход по больше или равно

  F5               ! SOBGTR      ! Вычитание единицы и пере-

                   !             ! ход по больше

  2B               ! SPANC       ! Пропуск символов

  82               ! SUBB2       ! Вычитание байтов, участву-

                   !             ! ют 2 операнда




                           - 260 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

  83               ! SUBB3       ! Вычитание байтов, участву-

                   !             ! ют 3 операнда

  62               ! SUBD2       ! Вычитание данных формата D

                   !             ! участвуют 2 операнда

  63               ! SUBD3       ! Вычитание данных формата D

                   !             ! участвуют 3 операнда

  42               ! SUBF2       ! Вычитание данных формата F

                   !             ! участвуют 2 операнда

  43               ! SUBF3       ! Вычитание данных формата F

                   !             ! участвуют 3 операнда

  42FD             ! SUBG2       ! Вычитание данных формата G

                   !             ! участвуют 2 операнда

  43FD             ! SUBG3       ! Вычитание данных формата G

                   !             ! участвуют 3 операнда

  62FD             ! SUBH2       ! Вычитание данных формата H

                   !             ! участвуют 2 операнда

  63FD             ! SUBH3       ! Вычитание данных формата H

                   !             ! участвуют 3 операнда

  C2               ! SUBL2       ! Вычитание длинных слов,

                   !             ! участвуют 2 операнда

  C3               ! SUBL3       ! Вычитание длинных слов,

                   !             ! участвуют 3 операнда




                           - 261 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

  22               ! SUBP4       ! Вычитание данных в упако-

                   !             ! ванном формате, участвуют

                   !             ! 4  операнда

  23               ! SUBP6       ! Вычитание данных в упако-

                   !             ! ванном формате, участвуют

                   !             ! 6 операндов

  A2               ! SUBW2       ! Вычитание слов, участвуют

                   !             ! 2 операнда

  A3               ! SUBW3       ! Вычитание слов, участвуют

                   !             ! 3 операнда

  O7               ! SVPCTX      ! Сохранение контекста про-

                   !             ! цесса

  95               ! TSTB        ! Проверка байта

  73               ! TSTD        ! Проверка данного формата D

  53               ! TSTF        ! Проверка данного формата F

  53FD             ! TSTG        ! Проверка данного формата G

  73FD             ! TSTH        ! Проверка данного формата H

  D5               ! TSTL        ! Проверка длинного слова

  B5               ! TSTW        ! Проверка слова

  FC               ! XFC         ! Распространенный функцио-

                   !             ! нальный вызов

  8C               ! XORB2       ! Исключающее "или" байтов,




                           - 262 -

                        00152-01 35 01


                                                  Продолжение

  -----------------------------------------------------------

  Шестнадцатеричное!Мнемоническое!       Выполняемое

  значение         !обозначение  !         действие

  -----------------------------------------------------------

                   !             ! участвуют 2 операнда

  8D               ! XORB3       ! Исключающее "или" байтов,

                   !             ! участвуют 3 операнда

  CC               ! XORL2       ! Исключающее "или" длинных

                   !             ! слов, участвуют 2 операн-

                   !             ! да

  CD               ! XORL3       ! Исключающее "или" длинных

                   !             ! слов, участвуют 3 операнда

  AC               ! XORW2       ! Исключающее "или" слов,

                   !             ! участвуют 2 операнда

  AD               ! XORW3       ! Исключающее "или" слов,

                   !             ! участвуют 3 операнда
























                           - 263 -

                        00152-01 35 01


                                                 Приложение 2





         Краткие сведения по языку макроассемблер




       1. ДИРЕКТИВЫ МАКРОАССЕМБЛЕРА

       В табл. 1 сведены все директивы языка  макроассемблер,

  как общие,  так  и  директивы  макрокоманд.  Все  директивы

  представлены в порядке алфавита.

                                                    Таблица 1

                   Директивы макроссемблера

  -----------------------------------------------------------

            Формат            !  Выполняемое действие

  ---------------------------------------------------------

   .ADDRESS список адресов    ! Хранит последовательные

                              ! длинные слова, содержащие

                              ! адреса данных

   .ALIGN Kлюч [,выражение]   ! Настраивает счетчик адресов

                              ! на границу, указываемую па-

                              ! раметром "ключ" (ключевое

                              ! слово)

   .ALIGN целое [,выражение]  ! Настраивает счетчик адресов

                              ! на границу, указываемую чис-

                              ! лом 2 в степени значения па-

                              ! раметра "целое" (целое чис-

                              ! ло)




                           - 264 -

                        00152-01 35 01


                                          Продолжение табл. 1

  -----------------------------------------------------------

            Формат            !  Выполняемое действие

  ---------------------------------------------------------

   .ASCIC строка              ! Хранит строку кодов КОИ-8

                              ! (заключенную между ограни-

                              ! чителями), перед которой

                              ! следует счетный байт

   .ASCID строка              ! Хранит строку кодов КОИ-8

                              ! (заключенную между ограни-

                              ! чителями), перед которой

                              ! следует описатель строки

   .ASCII строка              ! Хранит строку кодов КОИ-8

                              ! (заключенную между ограни-

                              ! чителями)

   .ASCIZ строка              ! Хранит строку кодов КОИ-8

                              ! (заключенную между ограни-

                              ! чителями), за которой сле-

                              ! дует нулевой байт

   .BLKA выражение            ! Резервирует длинные слова,

                              ! для адресов данных

   .BLKB выражение            ! Резервирует байты под дан-

                              ! ные

   .BLKD выражение            ! Резервирует квадрослова

                              ! для хранения данных двойной

                              ! точности с плавающей запятой

                              ! запятой в формате D




                           - 265 -

                        00152-01 35 01


                                          Продолжение табл. 1

  -----------------------------------------------------------

            Формат            !  Выполняемое действие

  ---------------------------------------------------------

   .BLKF выражение            ! Резервирует длинные слова

                              ! для хранения данных с плава-

                              ! ющей запятой одинарной точ-

                              ! ности в формате F

   .BLKG выражение            ! Резервирует квадрослова для

                              ! хранения данных с плавающей

                              ! запятой в формате G

   .BLKH выражение            ! Резервирует октослова для

                              ! хранения данных с плавающей

                              ! запятой расширенной точности

                              ! в формате H

   .BLKL выражение            ! Резервирует длинные слова

                              ! для хранения данных

   .BLKO выражение            ! Резервирует октослова

                              ! для хранения данных

   .BLKQ выражение            ! Резервирует квадрослова

                              ! для хранения данных

   .BLKW выражение            ! Резервирует слова для хра-

                              ! нения данных

   .BYTE список выражений     ! Генерирует последовательные

                              ! байты данных, при этом каж-

                              ! дый байт содержит значение,

                              ! которое определяется значе-




                           - 266 -

                        00152-01 35 01


                                          Продолжение табл. 1

  -----------------------------------------------------------

            Формат            !  Выполняемое действие

  ---------------------------------------------------------

                              ! нием выражения

   .CROSS                     ! Разрешает формирование таб-

                              ! лицы перекрестных ссылок

                              ! для всех символов

   .CROSS список символов     ! Таблица перекрестных ссылок

                              ! формируется для указанных

                              ! символов

   .DEBUG список символов     ! Делает известными отладчику

                              ! имена указанных символов

   .DEFAULT смещение,ключ     ! Указывает длину смещения,

                              ! принимаемую по умолчанию,

                              ! для режимов относительной

                              ! адресации

   .D_FLOATING список литера- ! Генерирует 8-байтное данное

               лов            ! с плавающей запятой двойной

                              ! точности формата D

   .DISABLE список аргументов ! Запрещает функцию (функ-

                              ! ции), указанную в списке

                              ! аргументов

   .DOUBLE список литералов   ! Эквивалентна директиве

                              ! .D_FLOATING

   .DSABL список аргументов   ! Эквивалентна директиве

                              ! .DISABLE




                           - 267 -

                        00152-01 35 01


                                          Продолжение табл. 1

  -----------------------------------------------------------

            Формат            !  Выполняемое действие

  ---------------------------------------------------------

   .ENABL список аргументов   ! Эквивалентна директиве

                              ! .ENABLE

   .ENABLE список аргументов  ! Разрешает функцию (функ-

                              ! ции), указанную в списке

                              ! аргументов

   .END [имя]                 ! Указывает на логический

                              ! конец исходной программы;

                              ! необязательный аргумент

                              ! имя указывает на адрес

                              ! точка входа

   .ENDC                      ! Указывает на конец блока

                              ! условной трансляции

   .ENDM [макроимя]           ! Указывает на конец мак-

                              ! роопределения

   .ENDR                      ! Указывает на конец блока

                              ! повторений

   .ENTRY символ [,выражение] ! Определяет входную точку

                              ! программы

   .ERROR [выражение] ;коммент! Выводит определенное сооб-

                              ! щение об ошибке

   .EVEN                      ! Гарантирует, что значение

                              ! текущего счетчика адресов

                              ! является четным (если




                           - 268 -

                        00152-01 35 01


                                          Продолжение табл. 1

  -----------------------------------------------------------

            Формат            !  Выполняемое действие

  ---------------------------------------------------------

                              ! значение нечетно, к нему

                              ! добавляется единица)

   .EXTERNAL список символов  ! Указывает на то, что сим-

                              ! волы, определенные в спе-

                              ! цификации, являются внеш-

                              ! ними

   .EXTRN список символов     ! Эквивалентна директиве

                              ! .EXTERNAL

   .F_FLOATING список литера- ! Генерирует 4-байтные дан-

               лов            ! ные с плавающей запятой

                              ! одинарной точности

                              ! формата F

   .FLOAT список литералов    ! Эквивалентна директиве

                              ! .F_FLOATING

   .G_FLOATING список литера- ! Генерирует 8-байтные дан-

               лов            ! ные с плавающей запятой

                              ! в формате G

   .GLOBAL список символов    ! Указывает на то, что сим-

                              ! волы, определенные в спе-

                              ! цификации, являются гло-

                              ! бальными

   .GLOBL                     ! Эквивалентна директиве

                              ! .GLOBAL




                           - 269 -

                        00152-01 35 01


                                          Продолжение табл. 1

  -----------------------------------------------------------

            Формат            !  Выполняемое действие

  ---------------------------------------------------------

   .H_FLOATING список литера- ! Генерирует 16-разрядные

               лов            ! данные с плавающей запятой

                              ! расширенной точности  в

                              ! формате H

   .IDENT строка              ! Обеспечивает средство

                              ! снабжения об'ектного моду-

                              ! ля дополнительной информа-

                              ! цией

   .IF условие аргумент(ы)    ! Начинает блок условной

                              ! трансляции, который состо-

                              ! ит из исходного кода и

                              ! включается в трансляцию

                              ! только в том случае, если

                              ! по отношению к указанному

                              ! аргументу (аргументам) вы-

                              ! полняется установленное

                              ! условие

   .IFF                       ! Эквивалентна директиве

                              ! .IF_FALSE

   .IF_FALSE                  ! Появляется только в преде-

                              ! лах блока условной транс-

                              ! ляции. Начинает блок ко-

                              ! дов, который подлежит




                           - 270 -

                        00152-01 35 01


                                          Продолжение табл. 1

  -----------------------------------------------------------

            Формат            !  Выполняемое действие

  ---------------------------------------------------------

                              ! трансляции в том случае,

                              ! если исходное условие лож-

                              ! но

   .IFT                       ! Эквивалентна директиве

                              ! .IF_TRUE

   .IFTF                      ! Эквивалентна директиве

                              ! .IF_TRUE_FALSE

   .IF_TRUE                   ! Появляется только в пре-

                              ! делах блока условной

                              ! трансляции. Начинает блок

                              ! кодов, который подлежит

                              ! трансляции в том случае,

                              ! если исходное условие яв-

                              ! ляется истинным

   .IF_TRUE_FALSE             ! Появляется только в преде-

                              ! лах блока условной

                              ! трансляции. Начинает блок

                              ! кодов, который подлежит

                              ! трансляции безусловно

   .IIF условие аргумент(ы)   ! То же самое, что одно-

        предложение           ! строчный блок условной

                              ! трансляции, когда условие

                              ! проверяется для указанного




                           - 271 -

                        00152-01 35 01


                                          Продолжение табл. 1

  -----------------------------------------------------------

            Формат            !  Выполняемое действие

  ---------------------------------------------------------

                              ! аргумента. Операция подле-

                              ! жит трансляции только в

                              ! том случае, если провероч-

                              ! ное условие истинно

   .IRP символ,               ! Заменяет формальный аргу-

        <список аргументов>   ! мент последовательными

                              ! фактическими аргументами,

                              ! указанными в списке аргу-

                              ! ментом

   .IRPC символ,<строка>      ! Заменяет формальный аргу-

                              ! мент последовательными

                              ! одиночными символами, ука-

                              ! занными в строке

   .LIBRARY имя макробиблио-  ! Определяет библиотеку мак-

                теки          ! рокоманд

   .LIST [список аргументов]  ! Эквивалентна директиве

                              ! .SHOW

   .LINK                      ! Включает дополнительные

                              ! записи для компоновщика

   .LONG список выражений     ! Генерирует последователь-

                              ! ные слова данных. Каждое

                              ! длинное слово содержит

                              ! значение, определяемое




                           - 272 -

                        00152-01 35 01


                                          Продолжение табл. 1

  -----------------------------------------------------------

            Формат            !  Выполняемое действие

  ---------------------------------------------------------

                              ! указанным выражением

   .MACRO макроимя,           ! Начинает макроопределение

       Список аргументов      !

   .MASK символ [,выражение]  ! Резервирует слово и копи-

                              ! рует в него маску сохра-

                              ! нения регистров

   .MCALL список макроимен    ! Указывает системные и/или

                              ! определяемые пользователем

                              ! макрокоманды из библиотек,

                              ! которые требуются для

                              ! трансляции исходной прог-

                              !  раммы

   .MDELETE список макроимен  ! Удаляет из памяти макро-

                              ! определения тех макроко-

                              ! манд, которые указаны в

                              ! списке

   .MEXIT                     ! Выход из расширения макро-

                              ! команды до завершения этой

                              ! макрокоманды

   .NARG символ               ! Определяет количество аргу-

                              ! ментов в текущем макровызо-

                              ! ве

   .NCHR символ,<строка>      ! Определяет количество зна-




                           - 273 -

                        00152-01 35 01


                                          Продолжение табл. 1

  -----------------------------------------------------------

            Формат            !  Выполняемое действие

  ---------------------------------------------------------

                              ! ков в указанной строке

   .NLIST [список аргументов] ! Эквивалентна директиве

                              ! .NOSHOW

   .NOCROSS                   ! Эапрещает формирование таб-

                              ! лицы перекрестных ссылок

                              ! для указанных символов

   .NOCROSS список символов   ! Запрещает формирование таб-

                              ! лицы перекрестных ссылок

                              ! для всех символов

   .NOSHOW                    ! Уменьшает значение счетчика

                              ! уровня трансляции

   .NOSHOW список аргументов  ! Управляет распечаткой лис-

                              ! тинга макрокоманд и блоков

                              ! условной трансляции

   .NTYPE символ,Oперанд      ! Может появляться только в

                              ! рамках макроопределения.

                              ! присваивает символу значе-

                              ! ние  режима адресации ука-

                              ! занного операнда

   .OCTA литерал              ! Запоминает 16 байт данных

   .OCTA символ               ! Запоминает 16 байт данных

   .ODD                       ! Дает гарантию того, что

                              ! значение текущего счетчика




                           - 274 -

                        00152-01 35 01


                                          Продолжение табл. 1

  -----------------------------------------------------------

            Формат            !  Выполняемое действие

  ---------------------------------------------------------

                              ! адресов является  нечетным

                              ! (если оно четное, то к нему

                              ! добавляется единица)

   .OPDEF код значения,       ! Определяет код операции и

  список описателей операнда  ! Список его операндов

   .PACKED десятичная строка  ! Генерирует десятичные числа

       [,символ]              ! в упакованном формате, две

                              ! цифры на байт

   .PAGE                      ! Вызывает перевод распечатки

                              ! листинга трансляции на на-

                              ! чало следующей страницы

   .PRINT [выражение] ;комменT! Выводит указанное сообщение

   .PSECT                     ! Начинает или продолжает не-

                              ! именованную программную

                              ! секцию

   .PSECT имя секции          ! Начинает или продолжает

                              ! программную секцию, опреде-

                              ! ляемую пользователем

   .QUAD литерал              ! Запоминает 8 байт данных

   .QUAD символ               ! Запоминает 8 байт данных

   .REF1  операнд             ! Генерирует операнд байта

   .REF2 Oперанд              ! Генерирует операнд слова

   .REF4 операнд              ! Генерирует операнд длин-




                           - 275 -

                        00152-01 35 01


                                          Продолжение табл. 1

  -----------------------------------------------------------

            Формат            !  Выполняемое действие

  ---------------------------------------------------------

                              ! ного слова

   .REF8 Oперанд              ! Генерирует операнд квадро-

                              ! слова

   .REF16 операнд             ! Генерирует операнд окто-

                              ! слова

   .RAPEAT выражение          ! Начинает блок повторений.

                              ! часть кода до следующей ди-

                              !  рективы .ENDR повторяется

                              ! такое количество раз, кото-

                              ! рое определяется значением

                              ! выражения

   .REPT                      ! Эквивалентна директиве

                              ! .REPEAT

   .RESTORE                   ! Эквивалентна директиве

                              ! .RESTORE_PSECT

   .RESTORE_PSECT             ! Востанавливает контекст

                              ! программной секции из стека

                              ! контекста программной сек-

                              ! ции

   .SAVE [локальный блок]     ! Эквивалентна директиве

                              ! .SAVE_PSECT

   .SAVE_PSECT [локальный     ! Сохраняет контекст текущей

                блок]         ! программной секции в стеке




                           - 276 -

                        00152-01 35 01


                                          Продолжение табл. 1

  -----------------------------------------------------------

            Формат            !  Выполняемое действие

  ---------------------------------------------------------

                              ! контекста программной сек-

                              ! ции

   .SBTTL комментарий         ! Эквивалентна директиве

                              ! .SUBTITLE

   .SHOW                      ! дает приращение счетчику

                              ! уровня листинга

   .SHOW список аргументов    ! Управляет процессом распе-

                              ! чатки макрокоманд и блоков

                              ! условной трансляции

   .SIGNED_BYTE список        ! Запоминает последовательные

        выражений             ! байты (8 разрядов), в кото-

                              ! рых хранятся данные со зна-

                              ! ком

   .SIGNED_WORD список        ! Запоминает последовательные

          выражений           ! слова (16 разрядов), в ко-

                              ! торых хранятся данные со

                              ! знаком

   .SUBTITLE комментарий      ! Распечатывает указанную

                              ! строку как часть заголовка

                              ! страницы листинга трансля-

                              ! ции. Кроме того, строки,

                              ! указанные в каждой

                              ! из директив




                           - 277 -

                        00152-01 35 01


                                          Продолжение табл. 1

  -----------------------------------------------------------

            Формат            !  Выполняемое действие

  ---------------------------------------------------------

                              ! .SUBTITLE, сводятся в таб-

                              ! лицу содержания, помещаемую

                              ! в начале листинга трансля-

                              ! ции

   .TITLE имя модуля          ! Принимает в качестве имени

     комментарий              ! об'ектного модуля первые 15

                              ! символов указанного имени мо-

                              ! дуля, а также обуславливает

                              ! появление его на каждой

                              ! странице листинга трансляции

   .TRANSFER символ           ! Указывает компоновщику пе-

                              ! реопределить значение гло-

                              ! бального символа для ис-

                              ! пользования в разделяемом

                              ! образе

   .WARN [выражение] ;комменT ! Выводит указанное преду-

                              ! преждающее сообщение

   .WEAK список символов      ! Указывает на то, что каждый

                              ! из перечисленных символов

                              ! имеет атрибут подавления

   .WORD список выражений     ! Генерирует последовательные

                              ! слова данных. Каждое слово

                              ! содержит значение, соот-




                           - 278 -

                        00152-01 35 01


                                          Продолжение табл. 1

  -----------------------------------------------------------

            Формат            !  Выполняемое действие

  ---------------------------------------------------------

                              ! ветствующее указанному вы-

                              ! ражению

       2. СПЕЦИАЛЬНЫЕ ЗНАКИ

       В табл. 2 собраны сведения о специальных знаках  языка

  макроассемблер.

                                                    Таблица 2

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

                        макроассемблер

  -----------------------------------------------------------

  Знак!  Наименование   !         Функция

  -----------------------------------------------------------

    _ !  Знак   подчер- ! Знак  в символических именах

      !   кивания       !

    $ !  Знак   денежной! Знак  в символических именах

      !  единицы        !

    . !  Точка          ! Знак  в символических именах, счет-

      !                 ! чик текущего адреса программы, де-

      !                 ! сятичная точка

    : !  Двоеточие      ! Ограничитель метки

    = !  Знак равенства ! Оператор прямого присваивания и ог-

      !                 ! раничитель аргумента ключевого

      !                 ! слова макрокоманды

      ! Знак  горизон-  ! Ограничитель поля предложения




                           - 279 -

                        00152-01 35 01


                                          Продолжение табл. 2

  -----------------------------------------------------------

  Знак!  Наименование   !         Функция

  -----------------------------------------------------------

      !тальной табуляции!

      !  Пробел         ! Ограничитель поля предложения

    # !   Знак  номера  ! Индикатор режима непосредствнной

      !                 ! адресации

    @ !  Коммерческое   ! Индикатор режима косвенной адреса-

      !     "эт"        ! ции и операция арифметического сд-

      !                 ! вига

    , !  Запятая        ! Разделитель полей, операндов и

      !                 ! пунктов

    ; ! Точка с запятой ! Индикатор поля комментария

    + !  Плюс           ! Индикатор режима адресации с авто-

      !                 ! увеличением, унарная операция

      !                 ! "плюс" и операция арифметического

      !                 ! суммирования

    - !  Минус или дефис! Индикатор режима адресации с авто-

      !                 ! уменьшением, унарная операция "ми-

      !                 ! нус", операция арифметического вы-

      !                 ! читания и индикатор переноса строки

    * !  Звездочка      ! Операция арифметического умножения

    / !  Дробная черта  ! Операция арифметического деления

    & ! Коммерческое "и"! Операция логического "и"

    ! !  Восклицательный! Операция логического "или"

      !   знак          !




                           - 280 -

                        00152-01 35 01


                                          Продолжение табл. 2

  -----------------------------------------------------------

  Знак!  Наименование   !         Функция

  -----------------------------------------------------------

    \ !  Обратная дроб- ! Операция исключающее "или" и инди-

      !  ная черта      ! катор числового преобразования в

      !                 ! аргументах макрокоманд

    ^ !  Стрелка вверх  ! Ограничитель унарной операции и

      !                 ! аргументов макрокоманд

   [ ]!  Квадратные     ! Индикаторы режима адресации с ин-

      !  скобки         ! дексацией и коэффициента повторе-

      !                 ! ний

   ( )!  Круглые скобки ! Индикаторы регистровой косвенной

      !                 ! адресации

   < >!  Угловые скобки ! Ограничители аргументов и выражений

    ? !   Знак  вопроса ! Индикатор автоматически создаваемых

      !                 ! локальных меток в аргументах макро-

      !                 ! команд

    ' !  Апостроф       ! Индикатор конкатенации аргументов

      !                 ! макрокоманд

    % !   Знак  процента! Строковые операции макрокоманд



       3. ОПЕРАЦИИ

       3.1. Унарные операции

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

  макроассемблер.






                           - 281 -

                        00152-01 35 01


                                                    Таблица 3

                       Унарные операции

  -----------------------------------------------------------

  Унарная!    Имя      !             !  Выполняемая

  опера- ! операции    !  Пример     !    операция

  ция    !             !

  -----------------------------------------------------------

     +   !  Знак  плюс ! +A          ! Дает положительное

         !             !             ! значение а

     -   !  Знак  минус! -A          ! Дает отрицательное

         !             !             ! (в виде дополнения

         !             !             ! до двух) значение а

     ^B  !  Знак  дво- ! ^B11000111  ! Интерпретирует число

         ! ичного ос-  !             ! 11000111 как двоич-

         ! нования     !             ! ное

     ^D  !  Знак  деся-! ^D127       ! Интерпретирует число

         ! тичного     !             ! 127 как десятичное

         ! основания   !             !

     ^O  !  Знак  вось-! ^O34        ! Интерпретирует число

         ! меричного   !             ! 34 как восьмерич-

         ! основания   !             ! ное

     ^X  !  Знак  шест-! ^XFGF9      ! Интерпретирует число

         ! надцате-    !             ! FGF9 как шестнадца-

         ! ричного     !             ! теричное

         ! основания   !             !

     ^A  !  Знак  опе- ! ^A/ABC/     ! Порождает строку

         ! ратора      !             ! кодов КОИ-8; символы,




                           - 282 -

                        00152-01 35 01


                                          Продолжение табл. 3

  -----------------------------------------------------------

  Унарная!    Имя      !             !  Выполняемая

  опера- ! операции    !  Пример     !    операция

  ция    !             !

  -----------------------------------------------------------

         ! КОИ-8       !             ! Заключенные между

         !             !             ! парными ограничителя-

         !             !             ! ми, преобразуются в

         !             !             ! коды КОИ-8


     ^M  !  Знак  опе- !#^M<R3,R4,R5>! Определяет регистры

         ! ратора ре-  !             ! R3,R4,R5 в регистро-

         ! гистровой   !             ! вой маске

         ! маски       !             !

     ^F  ! Знак формата! ^F3.0       ! Интерпретирует число

         ! с плавающей !             ! 3.0 как число с пла-

         ! запятой     !             ! вающей запятой

     ^C  !  Знак  до-  ! ^C24        ! Выполняет преобразо-

         ! полнения    !             ! вание десятичного

         !             !             ! значения 24 в допол-

         !             !             ! нительный код (до-

         !             !             ! полнение до единицы)

       3.2. Бинарные операции

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

  макроассемблер.








                           - 283 -

                        00152-01 35 01


                                                    Таблица 4

                       Бинарные операции

  -----------------------------------------------------------

   Знак   !  Наименование    ! Пример !     Операция

  -----------------------------------------------------------

     +    ! Знак  плюс      ! A+B    ! Сложение

     -    ! Знак  минус     ! A-B    ! Вычитание

     *    ! Звездочка       ! A*B    ! Умножение

     /    ! Косая черта     ! A/B    ! Деление

     @    ! Коммерческое    ! A@B    ! Арифметический сдвиг

          ! "эт"            !        !

     &    ! Коммерческое "и"! A&B    ! Логическое "И"

     !    ! Восклицатель-   ! A!B    ! Логическое "ИЛИ"

          ! ный  знак       !        !

     \    ! Обратная        ! A\B    ! Логическое исключаю-

          ! косая черта     !        ! щее "или"

       3.3. Строковые операции макрокоманд

       В табл. 5 сведены данные по  операциям  для  обработки

  аргументов макрокоманд в виде символьных строк. Эти  опера-

  ции могут использоваться только в макрокомандах.


















                           - 284 -

                        00152-01 35 01


                                                    Таблица 5

                Строковые операции макрокоманд

  -----------------------------------------------------------

      Формат                       ! Функция

  -----------------------------------------------------------

  %LENGTH(строка)                  ! Определяет значение,

                                   ! равное длине строки

                                   ! символов

  %LOCATE(строка1,строка2[,символ])! Определяет местоположе-

                                   ! ние фрагмента "строка1"

                                   ! в строке "строка2", на-

                                   ! чиная поиск с символа,

                                   ! положение которого оп-

                                   ! ределяется значением

                                   ! символа "символ"

  %EXTRACT(символ1,символ2,строка) ! Выделяет фрагмент стро-

                                   ! ки "строка", который на-

                                   ! чинается со знаковой

                                   ! позиции, указываемой

                                   ! значением "символ1", и

                                   ! имеет длину, определяе-

                                   ! мую значением "символ2"

       4. РЕЖИМЫ АДРЕСАЦИИ

       В табл. 6 собраны краткие сведения о режимах адресации

  языка макроассемблер.



                                       




                           - 285 -

                        00152-01 35 01


                                                    Таблица 6

                       Режимы адресации

  -----------------------------------------------------------

         ! Режим !          !Шест-   !                 !Воз-

         !адреса-!          !надца-  !                 !можна

   Тип   ! ции   !  Формат  !теричное!   Описание      !инде-

         !       !          !значение!                 !кса-

         !       !          !        !                 !ция

  -----------------------------------------------------------

  Адреса-!Регист-!RN        !    5   ! Регистр содержит! Нет

  ция ре-!ровый  !          !        ! операнд         !

  гистров!       !          !        !                 !

  Общего !Косвен-!(RN)      !    6   ! Регистр содержит! Да

  назна- !но-ре- !          !        ! адрес операнда  !

  чения  !гистро-!          !        !                 !

         !вый    !          !        !                 !

         !       !          !        !                 !

         !Адреса-!(RN)+     !    8   ! Регистр содержит! Да

         !ция с  !          !        ! адрес операнда; !

         !авто-  !          !        ! процессор увели-!

         !увели- !          !        ! чивает содержи- !

         !чением !          !        ! мое регистра на !

         !       !          !        ! размер типа дан-!

         !       !          !        ! ных операнда    !

         !       !          !        !                 !

         !Косвен-!@(RN)+    !    9   ! Регистр содержит! Да

         !ная ад-!          !        ! адрес    адреса !




                           - 286 -

                        00152-01 35 01


                                          Продолжение табл. 6

  -----------------------------------------------------------

         ! Режим !          !Шест-   !                 !Воз-

         !адреса-!          !надца-  !                 !можна

   Тип   ! ции   !  Формат  !теричное!   Описание      !инде-

         !       !          !значение!                 !кса-

         !       !          !        !                 !ция

  -----------------------------------------------------------

         !ресация!          !        ! операнда; проце-!

         !с авто-!          !        ! ссор увеличивает!

         !увели- !          !        ! содержимое реги-!

         !чением !          !        ! стра на 4       !

         !       !    1)    !        !                 !

         !Адреса-!-(RN)     !    7   ! Процессор умень-! Да

         !ция с  !          !        ! шает содержимое !

         !авто-  !          !        ! регистра на раз-!

         !умень- !          !        ! мер типа данных !

         !шением !          !        ! операнда, после !

         !       !          !        ! чего регистр со-!

         !       !          !        ! держит   адрес  !

         !       !          !        ! операнда        !

         !       !   2)     !        !                 !

         !Адре-  !смщ(RN)   !        ! Сумма содержимо-! Да

         !сация  !B^смщ(RN) !    А   ! го регистра и   !

         !по сме-!W^смщ(RN) !    C   ! смещения являет-!

         !щению  !L^смщ(RN) !    Е   ! ся адресом опе- !

         !       !          !        ! ранда; операции !




                           - 287 -

                        00152-01 35 01


                                          Продолжение табл. 6

  -----------------------------------------------------------

         ! Режим !          !Шест-   !                 !Воз-

         !адреса-!          !надца-  !                 !можна

   Тип   ! ции   !  Формат  !теричное!   Описание      !инде-

         !       !          !значение!                 !кса-

         !       !          !        !                 !ция

  -----------------------------------------------------------

         !       !          !        ! B^, W^, L^ ука- !

         !       !          !        ! зывают, соответ-!

         !       !          !        ! ственно, на сме-!

         !       !          !        ! щение в байтах, !

         !       !          !        ! словах и длинных!

         !       !          !        ! словах          !

         !Косвен-!@смщ(RN)  !        ! Сумма содержимо-! Да

         !ная ад-!@B^смщ(RN)!    B   ! го регистра  и  !

         !ресация!@W^смщ(RN)!    D   ! смещения являет-!

         !по сме-!@L^смщ(RN)!    F   ! ся адресом адре-!

         !щению  !          !        ! са операнда;    !

         !       !          !        ! операции B^,W^, !

         !       !          !        ! L^ указывают,   !

         !       !          !        ! соответственно, !

         !       !          !        ! на  смещение  в !

         !       !          !        ! байтах, словах и!

         !       !          !        ! в длинных словах!

         !Лите-  !#литерал  !        ! Указанный лите- ! Нет

         !ральная!S^литерал !   0-3  ! рал является    !




                           - 288 -

                        00152-01 35 01


                                          Продолжение табл. 6

  -----------------------------------------------------------

         ! Режим !          !Шест-   !                 !Воз-

         !адреса-!          !надца-  !                 !можна

   Тип   ! ции   !  Формат  !теричное!   Описание      !инде-

         !       !          !значение!                 !кса-

         !       !          !        !                 !ция

  -----------------------------------------------------------

         !адреса-!          !        ! операндом; лите-!

         !ция    !          !        ! рал хранится в  !

         !       !          !        ! формате коротко-!

         !       !          !        ! го литерала     !

  Адреса-!Относи-!адрес     !        ! Указанный адрес ! Да

  ция    !тельная!B^адрес   !    A   ! является адресом!

  через  !адреса-!W^адрес   !    C   ! операнда; ука-  !

  счетчик!ция    !L^адрес   !    E   ! занный   адрес  !

  инстру-!       !          !        ! хранится в виде !

  кций PC!       !          !        ! смещения относи-!

         !       !          !        ! тельно PC; опе- !

         !       !          !        ! раторы B^, W^,  !

         !       !          !        ! L^ указывают на !

         !       !          !        ! смещение, соот- !

         !       !          !        ! ветственно, в   !

         !       !          !        ! байтах, словах и!

         !       !          !        ! длинных словах  !

         !Косвен-!@адрес    !        ! Указанный адрес ! Да

         !ная от-!@B^адрес  !    B   ! является адресом!




                           - 289 -

                        00152-01 35 01


                                          Продолжение табл. 6

  -----------------------------------------------------------

         ! Режим !          !Шест-   !                 !Воз-

         !адреса-!          !надца-  !                 !можна

   Тип   ! ции   !  Формат  !теричное!   Описание      !инде-

         !       !          !значение!                 !кса-

         !       !          !        !                 !ция

  -----------------------------------------------------------

         !носи-  !@W^адрес  !    D   ! адреса операнда;!

         !тельная!@L^адрес  !    F   ! указанный адрес !

         !адреса-!          !        ! хранится в виде !

         !ция    !          !        ! смещения относи-!

         !       !          !        ! тельно PC; опе- !

         !       !          !        ! раторы B^,W^,L^ !

         !       !          !        ! указывают   на  !

         !       !          !        ! смещение, соот- !

         !       !          !        ! ветственно,  в  !

         !       !          !        ! байтах, словах и!

         !       !          !        ! длинных словах  !

         !Абсо-  !@#адрес   !    9   ! Указанный адрес ! Да

         !лютная !          !        ! является адресом!

         !адреса-!          !        ! операнда; указа-!

         !ция    !          !        ! нный адрес хра- !

         !       !          !        ! нится как абсо- !

         !       !          !        ! лютный действи- !

         !       !          !        ! тельный адрес, а!

         !       !          !        ! не как смещение !




                           - 290 -

                        00152-01 35 01


                                          Продолжение табл. 6

  -----------------------------------------------------------

         ! Режим !          !Шест-   !                 !Воз-

         !адреса-!          !надца-  !                 !можна

   Тип   ! ции   !  Формат  !теричное!   Описание      !инде-

         !       !          !значение!                 !кса-

         !       !          !        !                 !ция

  -----------------------------------------------------------

         !Непос- !#литерал  !        ! Указанный лите- ! Нет

         !редст- !I^#литерал!    8   ! рал   является  !

         !венная !          !        ! операндом; этот !

         !адреса-!          !        ! литерал хранится!

         !ция    !          !        ! как байт, слово,!

         !       !          !        ! длинное слово   !

         !       !          !        ! или как квадро- !

         !       !          !        ! слово           !

         !Адреса-!G^адрес   !    -   ! Указанный адрес ! Да

         !ция об-!          !        ! является адресом!

         !щего   !          !        ! операнда; если  !

         !вида   !          !        ! адрес определен !

         !       !          !        !как перемещаемый,!

         !       !          !        ! компоновщик за- !

         !       !          !        !поминает этот ад-!

         !       !          !        ! рес в виде сме- !

         !       !          !        !щения относитель-!

         !       !          !        ! но рс; если этот!

         !       !          !        ! адрес опеределен!




                           - 291 -

                        00152-01 35 01


                                          Продолжение табл. 6

  -----------------------------------------------------------

         ! Режим !          !Шест-   !                 !Воз-

         !адреса-!          !надца-  !                 !можна

   Тип   ! ции   !  Формат  !теричное!   Описание      !инде-

         !       !          !значение!                 !кса-

         !       !          !        !                 !ция

  -----------------------------------------------------------

         !       !          !        ! как абсолютный  !

         !       !          !        ! действительный  !

         !       !          !        ! адрес, компонов-!

         !       !          !        ! щик запоминает  !

         !       !          !        ! его как абсолют-!

         !       !          !        ! ное значение    !

         !       !       3) !        !                 !

  Индек- !Индек- !база[RX]  !    4   ! Параметр "база" ! Нет

  сация  !сация  !          !        ! определяет базо-!

         !       !          !        ! вый адрес, а ре-!

         !       !          !        ! гистр определяет!

         !       !          !        !индекс; сумма ба-!

         !       !          !        ! зового адреса и !

         !       !          !        ! произведения со-!

         !       !          !        ! держимого RX на !

         !       !          !        ! размер типа дан-!

         !       !          !        ! ных операнда;   !

         !       !          !        ! "база" может оп-!

         !       !          !        ! ределять любой  !




                           - 292 -

                        00152-01 35 01


                                          Продолжение табл. 6

  -----------------------------------------------------------

         ! Режим !          !Шест-   !                 !Воз-

         !адреса-!          !надца-  !                 !можна

   Тип   ! ции   !  Формат  !теричное!   Описание      !инде-

         !       !          !значение!                 !кса-

         !       !          !        !                 !ция

  -----------------------------------------------------------

         !       !          !        ! режим адресации,!

         !       !          !        !кроме прямого об-!

         !       !          !        ! ращения к регис-!

         !       !          !        ! тру, индексации !

         !       !          !        ! непосредственной!

         !       !          !        ! адресации лите- !

         !       !          !        ! ральной адреса- !

         !       !          !        ! ции и адресации !

         !       !          !        !в инструкциях от-!

         !       !          !        ! носительного пе-!

         !       !          !        ! рехода          !

  Адреса-!Адреса-!адрес     !    -   ! Указанный адрес ! Нет

  ция в  !ция в  !          !        ! является операн-!

  инст-  !инст-  !          !        ! дом; этот адрес !

  рукциях!рукциях!          !        !хранится как сме-!

  относи-!относи-!          !        ! щение относите- !

  тельно-!тельно-!          !        ! льно рс; данный !

  го пе- !го пе- !          !        ! режим адресации !

  рехода !рехода !          !        ! может использо- !




                           - 293 -

                        00152-01 35 01


                                          Продолжение табл. 6

  -----------------------------------------------------------

         ! Режим !          !Шест-   !                 !Воз-

         !адреса-!          !надца-  !                 !можна

   Тип   ! ции   !  Формат  !теричное!   Описание      !инде-

         !       !          !значение!                 !кса-

         !       !          !        !                 !ция

  -----------------------------------------------------------

         !       !          !        ! ваться только в !

         !       !          !        ! инструкциях от- !

         !       !          !        ! носительного пе-!

         !       !          !        ! рехода          !


  ---------------------
       1)
         RN - любой регистр общего назначения с R0 по R12. От

  метим, что вместо RN может использоваться любой из регистро

  AP, FP и SP.

       2)
         смщ - выражение, определяющее смещение.

       3)
         RX - любой регистр общего назначения с R0 по R12. От

  метим, что вместо RX может использоваться любой из регистро

  AP, FP и SP. RX не может быть тем же самым регистром, что

  RN, который определен в параметре  "база"  для  определенны

  базовых режимов.











                           - 294 -

                        00152-01 35 01


                                                 Приложение 3





         Шестнадцатерично-десятичное преобразование чисел




       При преобразовании шестнадцатеричных чисел в  десятич-

  ные часто оказываются полезными десятичные значения  степе-

  ней 2 и 16, которые представлены на рис. 1

       На рис. 2 приведены десятичные  значения  для  каждого

  возможного шестнадцатеричного значения в каждом байте длин-

  ного слова.

       Для того, чтобы преобразовать шестнадцатеричное  число

  в десятичное, для каждой цифровой позиции шестнадцатерично-

  го числа найдите на рис. 1 в соответствующей колонке  число

  и выпишите его десятичный эквивалент. Для  получения  деся-

  тичного числа сложите все выписанные эквиваленты.

       Пример 1.

          D0500AD0 (16)   =       ?(10)



          D0000000        =3,489,660,928

            500000        =    5,242,880

               а00        =        2,560

                D0        =          208

          --------         -------------

          D0500AD0         3,494,904,576


       Для преобразования десятичных чисел в  шестнадцатерич-




                           - 295 -

                        00152-01 35 01


  ные нужно выполнить четыре действия:

       1) найдите на рис. 1 наибольшее десятичное  число,  не

  превосходящее число, подлежащее преобразованию;

       2) запишите шестнадцатеричный эквивалент,  за  которым

  следуют нули в количестве,  соответствующем  числу  колонок

  минус один;

       3) вычтите найденное на рис. 2 десятичное значение  из

  десятичного значения, которое подлежит преобразованию;

       4) повторять шаги с первого по третий до тех пор, пока

  результат вычитания не станет равным нулю. Сложите получен-

  ные шестнадцатеричные эквиваленты и в результате  получится

  шестнадцатеричное число.

       Пример 2.

          22,466 (10)     = ?(16)

          20,480          = 5000           22,466
           1,792          =  700          -20,480
             192          =   C0           ------
               2          =    2            1,986
          ------            ----           -1,792
          22,466          = 57с2            -----
                                              194
                                           -  192
                                            -----
                                                2
                                           -    2
                                            -----
                                                0
















                           - 296 -

                        00152-01 35 01


          Степени 2               Степени 16

           **                       **
          2  N    N               16  N   N

           256    8                   1   0
           512    9                  16   1
          1024   10                 256   2
          2048   11                4096   3
          4096   12               65536   4
          8192   13             1048576   5
         16384   14            16777216   6
         32768   15           268435456   7
         65536   16          4294967296   8
        131072   17         68719476736   9
        262144   18       1099511627776  10
        524288   19      17592186044416  11
       1048576   20     281474976710656  12
       2097152   21    4503599627370496  13
       4194304   22   72057594037927936  14
       8388608   23 1152921504606846976  15
      1677772    24
                             рис.1

























                           - 297 -

                        00152-01 35 01


             Шестнадцатерично-десятичное преобразование

  16сс   10сс     16сс  10сс     16сс  10сс    16сс   10сс

   0             0 0           0  0             0  0        0
   1   268,435,456 1  16,777,216  1  1,048,576  1     65,536
   2   536,870,912 2  33,554,432  2  2,097,152  2    131,072
   3   805,306,368 3  50,331,648  3  3,145,728  3    196,608
   4 1,073,741,824 4  67,108,804  4  4,194,304  4    262,144
   5 1,342,177,280 5  83,886,080  5  5,242,880  5    327,680
   6 1,610,612,736 6 100,663,296  6  6,291,456  6    393,216
   7 1,879,048,192 7 117,440,512  7  7,340,032  7    458,752
   8 2,147,483,643 8 134,217,728  8  8,388,608  8    524,288
   9 2,415,919,104 9 150,994,944  9  9,437,184  9    589,82
   A 2,684,354,560 A 167,772,160  A 10,485,760  A    655,360
   B 2,952,790,016 B 184,549,376  B 11,534,336  B    720,896
   C 3,221,225,472 C 201,326,592  C 12,582,912  C    786,432
   D 3,489,660,928 D 218,103,808  D 13,631,488  D    851,968
   E 3,758,096,384 E 234,881,024  E 14,680,064  E    917,504
   F 4,026,531,840 F 251,658,240  F 15,728,640  F    983,040
  !                            !  !                        !
  ------------------------------  --------------------------
  !              байт                               байт   !
  ----------------------------------------------------------
                          слово
  16сс   10сс  16сс  10сс  16сс  10сс  16сс  10сс

   0         0  0        0  0       0   0      0
   1     4,096  1      256  1      16   1      1
   2     8,192  2      512  2      32   2      2
   3     12,288 3      768  3      48   3      3
   4     16,384 4    1,024  4      64   4      4
   5     20,480 5    1,280  5      80   5      5
   6     24,576 6    1,536  6      96   6      6
   7     28,672 7    1,792  7      112  7      7
   8     32,768 8    2,048  8      128  8      8
   9     36,864 9    2,304  9      144  9      9
   A     40,960 A    2,560  A      160  A     10
   B     45,056 B    2,816  B      176  B     11
   C     49,152 C    3,072  C      192  C     12
   D     53,248 D    3,328  D      208  D     13
   E     57,344 E    3,584  E      224  E     14
   F     61,440 F    3,840  F      240  F     15
  !                      !  !                  !
  ------------------------   -------------------
  !         байт                    байт       !
  ----------------------------------------------
                      слово
  16сс - шестнадцатеричное значение;
  10сс - десятичное значение
                             рис.2






                           - 298 -

                        00152-01 35 01





                 Перечень ссылочных документов




       1. Операционнаб система МОС ВП. Система программирова-

  ния  на  языке  макроассемблер.  Руководство  программиста.

  00152-01 33 01.












                           - 298к -

                      2б.00152-01 35 01





                 перечень ссылочных документов




       1. Операционная система МОС ВП. Система программирова-

  ния  на  языке  макроассемблер.  Руководство  программиста.

  2б.00152-01 33 01.

 
   
  
                         - 299K -

                      00152-01 35 01
  
  ------------------------------------------------------------
  I                                                          I
  I                  Лист регистрации изменений              I
  I                                                          I
  I----------------------------------------------------------I
  IНомера листов (страниц)IВсего IN     IВходящий IПодп.IДатаI
  I-----------------------IлистовIдоку- IN сопро- I     I    I
  IИ IИз- IЗа- IНо- IАнну-I(стра-Iмента Iводитель-I     I    I
  Iз Iме- Iме- Iвых Iлиро-Iниц   I      Iного до- I     I    I
  Iм Iнен-Iнен-I    Iван- Iв до- I      Iкум. И   I     I    I
  I. Iных Iных I    Iных  Iкум.  I      Iдата     I     I    I
  I----------------------------------------------------------I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I

 














!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!