<< Вернуться к содержанию





ПРИЛОЖЕНИЕ ... : АСЕМБЛЕРСКИ ДИРЕКТИВИ

                              АСЕМБЛЕРИ

     В базовото програмно осигуряване на компютрите от фамилията
"Пълдин" са включени са включени два програмни продукта - транслатори
на езика асемблер:  UniASM (среда за работа с езика АСЕМБЛЕР на
компютри от фамилията "Пълдин") и UniCROSS (крос-асемблер за създаване
в среда на MS DOS на компютри от фамилията IBM-PC-XT на асемблерски
програми за компютри от фамилията "Пълдин").  Поради малките формални
различия между тях, те са описани паралелно. Ако не е посочено друго,
сведенията се отнасят и за двата продукта.  В противен случай са
дадените разликите или отделните интерпретации.

     Ще отбележим, че в дистрибутивния комплект на UniASM е включен и
неговата крос-версия под името UASM.COM, предназначена за работа на
компютри от фамилията IBM-PC.

     Всеки от двата продукта позволява прякото генерирани на изпълними
непреместваеми програми (CMD).  UniCROSS позволява прякото генериране
и на преместваеми програми (PGM).  Обектни модули, създадени с помощта
на UniASM или UniCROSS, могат да бъдат обработени до изпълним вид с
помощта на свързващия редактор UniLINK, влизащ в състава на
операционната система UniDOS.  Освен това, Обектни модули, създадени с
помощта на UniASM могат да бъдат доведени до състояние на преместваеми
изпълними програми с помощта на програмата OBJ2PGM, влизаща в състава
на дистрибутивния комплект на UniASM.



                        ФАЙЛОВЕ НА АСЕМБЛЕРИТЕ

     Асемблерите работят с три вида файлове:
     - входни (source), съдържащи асемблерски програмен текст в
изходен вид;
     - отчетни (listing), съдържащи протокол на процеса на транслация;
     - изходни (output), съдържащи обектен модул (object) или
непреместваема изпълнима програма (CMD).  UniCROSS позволява прякото
генериране и на преместваеми програми (PGM).

     UniASM като резултат от работата си генерира алтернативно или
отчетен или изходен файл. Затова в текста тези файлове са наречени
общо резултатни (result).

     По премълчаване се използват следните разширения на файловите
имена:

                     UniASM     UniCROSS
     source            601         ASM
     listing           LST         LST
     result            PGM         OBJ

     object            OBJ         OBJ
     command           CMD         CMD
     program            -          PGM


     В UniCROSS е предвидена генерация на CMD-резултатен файл, ако в
текста на програмата се срещне директивата ORG. Ако се срещне
директивата PUBLIC и/или EXTERN, се генерира OBJ-резултатен файл. Ако
не се срещне нито една от изброените три директиви, то се генерира
PGM-релултатен файл.

     Ако при стартирането на UniASM не е изискано генерирането на
отчетен резултатен файл, при липса на директива CMD се генерира
OBJ-резултатен файл.

     ВХОДНИЯТ ФАЙЛ се обработва поредово, като всеки ред може да
съдържа само една инструкция. Максималната дължина на програмен ред е
80 символа за UniASM и 255 символа за UniCROSS. Празен ред и ред, в
който първият символ е ";", се считат коментарни редове и не се
обработват от транслаторите.

     Всеки програмен ред се състои от 4 полета, разделени с поне един
интервал или табулация:

               [етикет] <операция> {операнд} [коментар]

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

     ПОЛЕТО ЗА ЕТИКЕТИ е първо в програмния ред винаги, когато първият
символ не е интервал, табулация или ";". Етикетът се разглежда като
определен в програмата символ със стойност, равна на текущата стойност
на брояча на адресите. Броячът на адресите по време на транслация
определя адреса или отместването на инструкцията в паметта. Началната
стойност на брояча е равен на началния адрес на програмата. След всеки
обработен програмен ред стойността на брояча се увеличава с дължината
на инструкцията. По такъв начин етикетът представлява адрес на
следващата след него инструкция. Това позволява осъществяването на
програмни преходи без да се пресмята адресът. Този похват прави
програмата независима от разположението й в паметта на компютъра.

     В UniASM броячът на адреси се отбелязва със символа точка ".", а
в UniCROSS - със символа звезда "*".

     UniCROSS позволява разделянето на входния файл на процедури.
Всички етикети в една процедура имат локално значение. За обявяването
им като глобални е предвидена специална директива. В рамките на една
процедура са достъпни собствените й етикети, етикетите на обхващащите
я (родителски) процедури и глобалните етикети.

     ПОЛЕТО ЗА ОПЕРАЦИЯ съдържа мнемониката на машинна команда (всички
команди на процесора СМ601 са дадени в съответното приложение),
команда INT xx за изпълнение на системна функция на UniDOS с номер xx
(xx - шестнайсетично число), или директива на транслатора.  Ако е
записана команда, то се генерира съответния й машинен код, Ако е
записана директива, то тя се изпълнява.

     Ако машинната команда е двуоперандна, обозначението на първия
операнд (регистър A или B, или акумулатор X) се добавя към мнемониката
на командата.

     В UniASM освен стандартните са допустими и следните мнемоники
(на същия ред са посочени съответните им стандартни мнемоники):

                           BHS   -->   BCC
                           BLO   -->   BCS
                           LSL   -->   ASL
                           LSLA  -->   ASLA
                           LSLB  -->   ASLB

     Съдържанието на ПОЛЕТО ЗА ОПЕРАНД се определя от операцията.
Някои операции нямат операнди.

     Операндите могат да бъдат символи (етикети), константи, изрази,
списъци или символни низове (стрингове).

     Първи символ в ПОЛЕТО ЗА КОМЕНТАР трябва да бъде символът ";".
След него могат да се запишат произволни символи. Те не влияят на
процеса на транслация и на генерирания код.

     Форматът на ФАЙЛА НА ЛИСТИНГА е различен за двата асемблера.

     UniASM генерира листинг със следния формат:

         <адрес> <машинен код> <номер на ред> <изходен текст>

     Ако машинният код е по-дълъг от три байта, то се извеждат само
първите три байта.

     В края на листинга се извежда таблица на глобалните символи и
техните стойности. Неизползваните символи са отбелязани със знак "?",
недефинираните символи - със знак "!", а външните - със знак "*".
Локалните символи не се включват в символната таблица.

     UniCROSS генерира листинг с формат:

             <номер на ред> <адрес> <код> <изходен текст>

     И в двата случая











     СИМВОЛ се нарича определено в програмата име, чиято стойност се
представя чрез шестнайсетично число без знак. Символ се обявява чрез
посочените по-долу директиви. Името трябва да започва с латинска буква
и може да се състои от латински букви, цифри и символа за подчертаване
"_". Дължината на името се определя от дължината на реда, но се
отчитат само първите 8 символа.

     В UniASM броят на символите в една програма не трябва да
надхвърля 1900.






     Директивите са дадени в азбучен ред.  След поредния номер в
кръгли скоби е посочено за кой от двата продукта се отнася
директивата:  A - само за UniASM; C - само за UniCROSS; AC -
едновременно за UniASM и UniCROSS.



         1.(A) - ASC - Дефиниране на област от паметта (A)

     Синтаксис:       ASC <списък_от_изрази>

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

     Забележки: всеки израз трябва да има стойност в диапазона 0..255.


         2.(AC) - CHK - CHKSUM - контролна сума

     Синтаксис:
         UniASM:      CHK
         UniCROSS:    CHKSUM

     Предназначение:  формиране и запис на контролен байт, осигуряващ
нулева контролна сума, изчислявана чрез еднобайтово събиране без
пренос. Препоръчва се при асемблиране на програми, предназначени за
запис в ROM.

     Забележки: в UniCROSS се използва само при създаване на
непреместваеми изпълними програми (CMD).



         3.(A) - CMD - създаване на CMD-файл

     Синтаксис:       CMD [израз]

     Предназначение: задаване на изходен файл тип CMD (непреместваем
изпълним) с начален адрес, определен от стойността на израза. По
премълчаване началният адрес е равен на $100.

     Забележки: директивата трябва да се въведе ПРЕДИ определяне на
първия символ и ПРЕДИ първата изпълнима инструкция. Ако такава
директива не е въведена, то UniASM формира изходен файл от типа OBJ.



         4.(AC) - DB - DFB - Дефиниране на байт(ове)

     Синтаксис:
         UniASM:      DFB <списък_от_изрази>
         UniCROSS:    DB  <списък_от_изрази>

     Предназначение: запис в обектния код на един или повече байта,
всеки от които съдържа стойността на поредния израз в списъка.

     Забележки:
     В UniASM се изисква всеки израз да има стойност в диапазона 0..255.

     В UniCROSS, ако някой израз има стойност извън диапазона 0..255,
то се отчита младшият байт на съответната стойност.


         5.(AC) - DS - Дефиниране на област от паметта

     Синтаксис:       DS <израз_1> [,<израз_2>]

     Предназначение:  област от паметта, дълга <израз_1> байта, се
запълва със стойността на <израз_2>. По премълчаване <израз_2>=$00.

     Забележки:
     В UniASM се изисква стойността на <израз_2> да има дължина 1
байт, а <израз_1> да бъде от абсолютен тип и в него да не участват
неопределени и/или външни символи.

     В UniCROSS, ако <израз_2> има стойност извън диапазона 0..255,
то се отчита младшият байт на стойността.  В изразите не трябва да
участват етикети.



         6.(AC) - DW - Дефиниране на дума(и)

     Синтаксис:       DW <списък_от_изрази>

     Предназначение: запис в обектния код на еднa или повече думи
(старши байт, младши байт), всяка от които съдържа стойността на
поредния израз в списъка.

     Забележки: като израз не може да се използва символен низ.



         7.(AC) - END - край на програма

     Синтаксис:
         UniASM:      END
         UniCROSS:    END [израз]

     Предназначение:  Формиране край на програмата. Текстът след
инструкцията се игнорира.

     Забележки: В UniCROSS, ако е въведен израз, то неговата стойност
определя стартовия адрес в случай на асемблиране на преместваеми
модули (PGM и OBJ). По премълчаване стартовият адрес съответства на
адреса на началото на програмата.


         8.(C) - ENDP - край на процедура

     Синтаксис:       ENDP

     Предназначение:  Формиране край на процедура, чието начало е
определено с директива PROC.


         9.(AC) - ENDS - край на секция

     Синтаксис:       ENDS

     Предназначение: формиране на край на фиктивна секция. Началото на
фиктивна секция се формира с директива SECT в UniASM и директива
SECTION в UniCROSS. След изпълнението на директивата броячът на адреси
получава стойността, която е имал преди изпълнението на съответната
директива за формиране на фиктивна секция.

     Забележки: използването на ENDS извън фиктивна секция е
недопустимо в UniCROSS и без последствия в UniASM.



         10.(A) - ENT - определяне на вътрешен символ

     Синтаксис:       <символ> ENT [израз]

     Предназначение: определяне на вътрешен символ - само при
генериране на OBJ изходен файл.

     Забележки: изразът трябва да бъде от относителен тип и не трябва
да включва неопределен и/или външен символ. Ако не е въведен израз, то
директивата трябва да се намира в относителна секция и символът
получава стойност, равна на текущата стойност на брояча на адресите.


         11.(AC) - ERR - ERROR - грешка

     Синтаксис:
         UniASM:      ERR [израз]
         UniCROSS:    ERROR <израз>

     Предназначение:  преминаване към състояние ГРЕШКА, ако изразът
има ненулева стойност.

     Забележки: в UniASM изразът трябва да бъде от абсолютен тип и в
него не могат да участват неопределени и външни символи. Ако не е
въведен израз, състоянието ГРЕШКА се възбужда винаги.


         12.(AC) - EQU - определяне на символ (етикет)

     Синтаксис:       <символ> EQU <израз>
                      <символ>    =  <израз>

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

     Забележки: символът не трябва да бъде определен до изпълнението
на директивата и в израза не може да бъде включен външен символ.
                В UniASM директивата не ограничава блока на локалните
символи.


         13. (AC) - EXT - EXTERN - обявявяне на външен символ

     Синтаксис:
         UniASM:      <символ> EXT
         UniCROSS:    EXTERN <списък_етикети>

     Предназначение: обявяване на външни за модула символи (етикети).

     Забележки: в UniASM директивата може да се използва само, ако се
създава OBJ-файл и обявяваният символ получава относителен тип.



         14.(C) - GLOBAL - обявяване на глобални етикети

     Синтаксис:       GLOBAL <списък_етикети>

     Предназначение: обявяване на списък глобални етикети.

     Забележки: директивата трябва да следва непосредствено
директивата PROC.



         15.(C) - INCLUDE - включване на файл

     Синтаксис:       INCLUDE <име_на_файл>

     Предназначение: включване в транслирания файл на файл с
посоченото име.

     Забележки: допуска се влагане на процедурата до 8 ниво.



         16.(AC) - LIST - управление на листинга

     Синтаксис:
         UniASM:      LIST [израз]
         UniCROSS:    LIST [ключ]

     Предназначение:  включване (UniASM:  израз = 0; UniCROSS:  ключ
ON - по премълчаване) или изключване (UniASM:  израз <> 0; UniCROSS:
ключ OFF) на листинга по време на асемблирането.

     Забележки:  в UniASM изразът трябва да бъде от абсолютен тип и не
трябва да съдържа неопределени или външни символи.  Ако изразът е
пропуснат, листингът се превключва алтернативно.  Директивата не влияе
на работата, ако при стартиране на UniASM не е въведен параметър /l.
Въведена в края на програмата, директивата управлява извеждането на
таблицата на символите.


         17.(A) - MAIN - определяне на стартов адрес

     Синтаксис:       MAIN

     Предназначение: като стартов адрес (адрес на входна точка) се
определя адресът на последното използване на директивата.

     Забележки: използването на директивата MAIN след директивата CMD
е безсмислено.



         18.(AC) - ORG - даване стойност на адресния брояч

     Синтаксис:
         UniASM:      ORG [израз]
         UniCROSS:    ORG <израз>

     Предназначение:
         UniASM: ако е въведен израз - формиране начало на нова
програмна секция с тип (абсолютен или относителен), съвпадащ с типа на
израза и ЛОГИЧЕСКИ адрес, равен на стойността на израза; ако не е
въведен израз - формиране на край на текущата секция и връщане към
предидущата - възстановяване типа на текущата секция и стойността на
адресния брояч.

         UniCROSS: даване на адресния брояч на стойност, равна на
стойността на израза.

     Забележки:
         UniASM: допуска се влагане на секции на едно ниво. Изразът не
трябва да включва неопределени и/или външни символи. Забранено е
използването на директивата във фиктивна секция.

         UniCROSS: Изразът не трябва да включва етикет и неговият
резултат трябва да бъуде от типа константа. Забранено е използването
на директивата във фиктивна секция.



         19.(A) - PAGE - определяне на брой редове на страница от
                         листинга

     Синтаксис:       PAGE [израз]

     Предназначение: определяне на брой редове на страница от листинга
(ако е въведен израз) и преминаване на нова страница.

     Забележки: изразът трябва да бъде от абсолютен тип и не трябва да
съдържа неопределени и/или външни символи. Директивата не влияе на
работата, ако при стартиране на UniASM не е въведен параметър /l.



         20.(C) - PROC - обявяване начало на процедура

     Синтаксис:       <етикет> PROC

     Предназначение: определяне началото на процедура.

     Забележки: в една процедура могат да се съдържат неограничен брой
вложени процедури. Всички етикети в една процедура, необявени чрез
директива GLOBAL за глобални, се считат локални.




        21.(C) - PUBLIC - обявяване на общодостъпни етикети

     Синтаксис:       PUBLIC <списък_етикети>

     Предназначение:  обявяване на етикети на модула, които са
достъпни за други модули на програмата.



        22.(C) - RADIX - преминаване към нова бройна система

     Синтаксис:       RADIX <израз>

     Предназначение:  преминаване към нова бройна система с основа,
равна на стойността на израза (в интервала 2..16).



        23.(AC) - SECT - SECTION - формиране начало на фиктивна секция

     Синтаксис:
        UniASM:       SECT [израз]
        UniCROSS:     SECTION [израз]

     Предназначение: формиране на начало на фиктивна секция от адрес,
равен на стойността на израза или равен на текущата стойност на
адресния брояч, ако изразът е пропуснат.

     Забележки: фиктивните секции не могат да бъдат вложени.

        UniASM: използването на SECT без ENDS вътре във фиктивна
секция води до изменение на стойността на адресния брояч и типа на
секцията.  Изразът не може да съдържа неопределени и/или външни
символи.



         24.(A) - STR - дефиниране на символен низ в паметта

     Синтаксис:       STR <списък_от_изрази>

     Предназначение: запис в обектния код на един или повече байта,
всеки от които съдържа стойността на поредния израз в списъка. Преди
списъка от стойности в паметта се записва техният брой (дължината на
символния низ).

     Забележки: всеки израз трябва да има стойност в диапазона 0..255.



        25.(C) - TRUNC - прекъсване на листинга

     Синтаксис:       TRUNC <ключ>

     Предназначение: прекъсване (ключ ON) или възстановяване (ключ
OFF) извеждането на листинга след първия ред от фрагмент, съдържащ
директиви DB, DW, DS.

     Забележки: читаемостта на листинга се повишава чрез съкращаване
на малоинформативните части.



        26.(A) -  ==  - преопределяне на символ

     Синтаксис:       <символ> == <израз>

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