Дата последнего обновления файла 8.11.2009

Операторы языка программирования PL/M-51

В языке программирования PL/M-51 используется два типа операторов: операторы объявления и выполняемые операторы. Все операторы PL/M-51 заканчиваются точкой с запятой.

Операторы объявления

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

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

Переменные, константы, литералы и подпрограммы должны быть объявлены раньше, чем они будут использоваться в выполняемом операторе. Метка полностью объявлена, если она стоит перед выполняемым оператором и заканчивается с двоеточием (:) или определена в операторе DECLARE. Подпрограмма объявляется оператором PROCEDURE и заключается между операторами PROCEDURE и END. Переменные, константы и литералы должны объявляться оператором DECLARE.

DECLARE Width byte;

Этот оператор вводит идентификатор (переменную) Width (ширина англ) и резервирует 1 байт (8 бит) памяти. В языке программирования PL/M-51 нет необходимости знать конкретный адрес этой переменной, достаточно обратиться к ней по имени Width.

Группа операторов, предназначенных для выполнения какой-либо функции, может быть задана именем, объявляющим их как подпрограмму.

Address_Upper: PROCEDURE (Beta) byte;

Исполняемые операторы

В языке программирования PLM-51 используются беззнаковые арифметические операции, результат которых зависит от типа операндов:

  1. + суммирование
  2. - вычитание
  3. * умножение
  4. / деление
  5. mod вычисление остатка от целочисленного деления

В языке программирования PLМ-51 также определена одноместная операция '-'. Для нее требуется один операнд, которому она предшествует.

При использовании в операции различных типов операндов (byte или word) происходит автоматическое преобразование типов к одному виду (word). Если в выражении необходимо одновременно использовать тип bit, то нужно использовать функции преобразования типов boolean, expand или propagate.

В условном операторе и операторах цикла используются операции отношения:

  1. < меньше
  2. > больше
  3. <= меньше или равно
  4. >= больше или равно
  5. = равно
  6. <> не равно

Если указанное отношение между операндами верно, то результат битового типа равен 1, иначе — 0. Например, если d=7, то:

(d > 5) результат будет 1 (истина)
(d = 4) результат будет 0 (ложь) 

Над переменными можно осуществлять логические операции:

  1. not побитовая инверсия операнда
  2. and логическое "и"
  3. or логическое "или"
  4. xor "исключающее или" (суммирование по модулю два)

Приоритеты операций

В таблице 1 приведены приоритеты операторов языка программирования PL/M-51 от высшего приоритета к низшему. Порядок вычисления выражения следующий: сначала выполняются операторы в круглых скобках, в них от старшего приоритета к младшему, а среди равнозначных операторов — слева направо.

Таблица 1

Оператор Класс Описание
(, ) Скобки Управляют порядком вычислений выражения внутри скобок, вычисляются до действий над операторами вне скобок
+, . , - Унарная операция Одиночный оператор плюс, оператор адреса, одиночный оператор минус
*, /, MOD, =, - , PLUS, MINUS Арифметическая операция Умножение, деление, модуль (остаток) от деления, сложение, вычитание
<, <=, <>, =, >=, > Операция отношения Меньше, меньше или равно, не равно, равно, больше или равно, больше
NOT AND OR, XOR Логическая операция Логическое отрицание Логическое 'И' Логическое 'ИЛИ', логическое исключающее 'ИЛИ'

Оператор присваивания

Оператор присваивания записывается в виде:

Переменная=выражение;

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

Пример оператора присваивания: A=B+2;

Выражение в языке программирования PL/M-51 состоит из операндов, которые комбинируются при помощи различных арифметических или логических операций, а также операций отношения.

Например:

А + В
А + В - С
A * T + F/D
A * (B + C) - (D - E)/F
A XOR B,

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

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

Язык программирования PL/M-51 обеспечивает автоматическое преобразование между типами BYTE и WORD, но не может автоматически преобразовывать битовые переменные в числовые.

Числовые значения могут быть преобразованы к битовому типу при помощи встроенной функции BOOLEAN, которая возвращает битовое значение, равное биту в младшем разряде исходного числа. Битовая переменная может быть преобразована в числовую при помощи встроенных функций EXPAND и PROPAGATE. Обе процедуры преобразуют 0 (ложь) в число 00h. Функция EXPAND преобразует 1 (истина) в число 01h, а PROPAGATE преобразует 1 в число 0ffh (255). Например, встроенная функция propagate преобразует битовое значение в байт:

I = J + Propagate(Magic_Bit);

Условный оператор

Оператор IF обеспечивает условное выполнение операторов. Этот оператор полностью соответствует структурно-логической цепочке условного исполнения оператора метода структурного программирования. Он записывается в следующей форме:

  IF <выражение> THEN
      <operator-1>;
    [ELSE
      <operator-2>;]

ключевое слово THEN и исполняемый оператор, следующий за ним, записываются всегда, а ключевое слово ELSE со следующим за ним исполняемым оператором представляют собой необязательную часть условного оператора. Если результат вычисления выражения равен 1 (истина), то выполняется operator-1. Если результат вычисления выражения равен 0 (ложь), то выполняется operator-2. Пример:

 IF Wes<Min then      /*Условная операция*/
   Schetch=Schetch+1;   /*Плечо 1*/
  else 
   Schetch=0;           /*Плечо 2*/ 

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

 IF PrinjatByte then
   Call DecodCmd;

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

Структурный оператор do;end;

Существует три основных способа использования структурного оператора:

  1. Структурный оператор может рассматриваться в качестве отдельного оператора языка PL/M-51 и использоваться в программе везде, где может встречаться отдельный исполняемый оператор. Это используется в блоках DO CASE и операторах IF;
  2. Структурный оператор ограничивает область действия локальных переменных.
  3. Вся программа написанная на языке программирования PL/M-51 сама может рассматриваться как структурный оператор do;end, удовлетворяющим дополнительным требованиям.

Каждый оператор внутри структурного оператора может являться любым оператором языка PL/M-51, в том числе и объявлением, при условии, что все объявления внутри структурного оператора должны быть выполнены до первого исполняемого оператора.

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

  do;
    <operator-1>;
    <operator-2>;
    ...
    <operator-n>;
    end;
Пример:
 IF Wes<Min then      /*Условная операция*/
   do;                  /*Структурный оператор*/
     incr=incr*2;          /*Содержит два*/
     Schetch=Schetch+1;    /*оператора*/
   end;

Структурные операторы могут вкладываться друг в друга. При этом максимальное число уровней вложенности не может превышать 16.

Пример:
do;
  <operator-1>;
  <operator-2>;
  do;
    <operator-A>;
    <operator-B>
    <operator-C>;
  end;
  <operator-3>;
  <operator-4>;
end;

Оператор цикла do

Оператор цикла DO записывается в следующей форме:

do <переменная цикла> = <начальное выражение>to<конечное выражение>;
  <operator-1;
  <operator-2>;
  ...
  <operator-n>;
end;

где переменная цикла должна быть простой скалярной переменной и иметь тип BYTE или WORD. Она не может быть элементом массива или быть базированной переменной. Начальное выражение и конечное выражение могут быть любыми разрешенными выражениями языка PL/M-51. Они тоже должны иметь тип byte или word. Оператор цикла работает следующим образом:

  1. Вычисляется начальное выражение и его значение присваивается переменной цикла. Это делается только один раз до первого прохождения через блок.
  2. Вычисляется конечное выражение и его значение сравнивается со значением переменной цикла. Если значение переменной цикла больше, чем значение конечного выражения, то шаги 3 и 4 данного алгоритма пропускаются и управление передается оператору, следующему за оператором END.
  3. В блоке выполняются операторы. При достижении оператора END вновь определяется значение переменной цикла.
  4. Значение переменной цикла увеличивается на 1. Если при этом не произойдет переполнения переменной, то происходит снова выполнение шага 2. Иначе цикл завершается.

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

Пример:
 do j = 0 to 9 by 2;
   Vector(j) = 0;
 end;

В более общей форме оператора цикла DO разрешается использовать значение шага цикла, отличающееся от 1. Эта форма выглядит следующим образом:

 do <переменная цикла> = <начальное выражение> to <конечное выражение> by <выражение шага>;
   <operator-1>;
   <operator-2>;
   ...
   <operator-n>;
end;

В данном случае переменная цикла, которая задается в операторе DO, увеличивается каждый раз при достижении оператора END на значение шага, равное значению выражения шага, а не на 1. Пример использования такой формы оператора DO:

SOS=1;
do i=1 to 2*X by 2;
  SOS= SOS*ARY(i);
end;

Значение выражения шага может иметь тип BYTE или WORD. Выражение шага цикла вычисляется каждый раз сразу же после выполнения всех операторов в операторе цикла. Аналогично структурному оператору, оператор цикла может рассматриваться как одиночный оператор языка PL/M-51. В отличие от структурного оператора, оператор цикла не может содержать в себе объявлений. Однако он может содержать вложенный структурный оператор, в  котором можно поместить объявления переменных.

Оператор цикла с проверкой условия до тела цикла do while

Оператор DO WHILE содержит условную операцию (такую же, как в части IF оператора IF), и вызывает исполнение операторов в этом блоке до тех пор, пока условие верно. В следующем примере оператор DO WHILE используется для пошагового прохождения по элементам массива Table до тех пор, пока очередной элемент не превысит значение скалярной переменной с именем Level (уровень англ.):

  i = 0;
  do while table(i) <= Level;
    i = i + 1;
  end;

В этом примере Table – это предварительно объявленный массив. Переменные Level и i тоже должны быть предварительно объявлены.

Переменной i первоначально присваивается значение 0, затем она используется как индекс для массива Table. Так как i увеличивается при каждом выполнении блока DO WHILE, то  каждый раз, когда выполняется исполняемый оператор внутри блока DO WHILE, с переменной Level сравнивается следующий элемент массива Table. Когда найден элемент, превышающий значение переменной Level, то условие в операторе DO WHILE больше неверно, выполнение блока не повторяется и управление передается следующему за зарезервированным словом END оператору. С этого момента переменная i является индексом первого элемента массива Table, который превышает значение переменной Level.

Оператор выбора do case

Оператор DO CASE, использует значение данного выражения для выбора исполняемого оператора. Следует отметить, что язык программирования PLM-51 ориентирован на микроконтроллеры MCS-51. Поэтому для реализации данного оператора используется команда процессора JMP @A+DPTR. Это означает, что команда выполняется за два машинных цикла. В следующем примере Tst_1 в операторе DO CASE может иметь любое значение от 0 до 3.

do case Tst_1;
  red = 0;
  blue = 0;
  green = 0;
  gray = 0;
end;

Если значение выражения равно 0, то выполняется только первый оператор присваивания, и 0 будет присвоен переменной red (красный англ). Если значение выражения равно 1, то будет выполнен только второй оператор присваивания и переменной blue (голубой англ) будет присвоен 0. Значения выражения 2 и 3 вызовет присваивание 0 переменным green (зеленый англ) и gray (серый англ) соответственно.

Максимальное число выбираемых операторов может быть 84. В операторе должны присутствовать все варианты выбора! Если какой либо оператор не нужен, то используется пустой оператор, состоящий только из символа ';'. Если же по одному из вариантов требуется выполнение нескольких операторов, то можно воспользоваться структурным оператором.

Оператор безусловного перехода GOTO

Оператор GOTO изменяет порядок выполнения программы при помощи передачи управления на оператор, метка которого указана в операторе GOTO. Ключевое слово GOTO может также записываться со вставленным пробелом, т.е. в виде GO TO. Оператор GOTO записывается в следующем виде:

GoTo < метка >;

Использование операторов GOTO является неизбежным при некоторых ситуациях, однако в большинстве случаев там, где должна быть предусмотрена передача управления, более предпочтительным является использование итеративного оператора DO, DO WHILE, DO CASE, IF или вызова процедуры. Неограниченное использование операторов GOTO в программе приводит к тому, что программу становится трудно понимать, модифицировать и сопровождать. Реальная практика использования языка PL/M-51 для программирования как системных, так и прикладных задач, показывает, что в большинстве случаев программные модули могут не содержать оператор GOTO без ухудшения их эффективности.

Оператор вызова подпрограммы CALL

Оператор  CALL  используется  для  того,  чтобы вызвать подпрограмму- процедуру (т.е. подпрограмму, которая не возвращает значения). Пример использования оператора CALL:

   Call DecodCmd;

Оператор возвращения из подпрограммы RETURN.

Выполнение подпрограммы может завершаться выполнением оператора RETURN в теле подпрограммы. Подпрограмма-функция обязательно должна содержать оператор RETURN с выражением в качестве операнда. Пример использования оператора RETURN:

   RETURN 2+2;

Пустой оператор.

Пустой оператор не содержит ничего, кроме пробелов и комментариев. Это выполняемый оператор без какого-либо воздействия на программу. У пустого оператора может быть метка. Пустой оператор удобно использовать как часть конструкции DO CASE. Пустой оператор завершается точкой с запятой ‘;’.

Литература:

  1. Л.К. Гребенников А.А. Летник Программирование микропроцессорных систем на языке ПЛ/М, М, 1986

Вместе со статьей "Операторы языка программирования PL/M-51" читают:

Языки программирования для микроконтроллеров
http://digteh.ru/Progr/progr.php

Язык программирования C-51
http://digteh.ru/MCS51/C51/op_c51.php

Язык программирования ASM-51
http://digteh.ru/MCS51/C51/op_c51.php

Язык программирования PLM-51
http://digteh.ru/MCS51/C51/op_c51.php


Автор Микушин А. В. All rights reserved. 2001 ... 2015

Предыдущие версии сайта:
http://neic.nsk.su/~mavr
http://digital.sibsutis.ru/

пЕИРХМЦ@Mail.ru


Rambler's Top100