Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DMITR / USED / INTE8051.DOC
Скачиваний:
5
Добавлен:
16.04.2013
Размер:
224.77 Кб
Скачать

3. Выражения языка

3.1. Элементы выражений

Выражение - это конструкция языка, определяющая алгоритм вычисления числового значения на этапе ассемблирования исходного модуля. Числовые значения представляются целыми 16-битными числами с диапазоном от 0 до 65535.

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

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

Перечень имен операторов выражения согласно п. 2.3.4.

3.2. Tермы в выражениях

Терм - это наименьшая и неделимая часть выражения, которая представляет числовое значение на этапе ассемблирования.

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

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

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

В языке ассемблера имеются следующие термы:

  1. число;

  2. литерная строка;

  3. имя внутреннего обьекта программы типа "число", определенное директивой EQU или SET (см. П. 5.9);

  4. имя внешнего обьекта программы типа "число", определенное директивой EXTRN (см. П. 5.11.2);

  5. имя метки (см. П. 4.4);

  6. встроенное имя;

  7. имя внутреннего обьекта программы типа "адрес", определенное директивой EQU или SET (см. П. 5.9);

  8. имя внешнего обьекта программы типа "адрес", определенное директивой EXTRN (см. П. 5.11.2);

  9. указатель счетчика адреса;

  10. имя перемещаемого сегмента (см. П. 5.3).

Перечень термов и связанных с ними атрибутов согласно табл. П.2.2.

Таблица П.2.2

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

! А т р и б у т ы

Т е р м ---------------------------------------------

! "тип" !"сегмент" !"фиксатор" !"величина"

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

! ! ! !

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

строка, имя внут- ! ! лен ! !

реннего обьекта ! ! ! !

"число" ! ! ! !

! ! ! !

имя внешнего обьек-! то же ! то же ! перемести-! неопреде-

та типа "число" ! ! ! мый ! лена

! ! ! !

имя метки, имя ! адрес !CODE|DATA|! абсолютный! определена

внутреннего обьекта! !XDATA|BIT|! или пере- !

типа "адрес" ! !IDATA ! местимый !

! ! ! !

имя внешнего обьек-! то же ! то же ! перемести-! неопреде-

та типа "адрес" ! ! ! мый ! лена

! ! ! !

указатель счетчика ! --//--! --//-- ! абсолютный! определена

адреса ! ! ! или пере- !

! ! ! местимый !

! ! ! !

имя перемещаемого ! --//--! --//-- ! перемести-! неопреде-

сегмента ! ! ! мый ! лена

! ! ! !

встроенное имя ! --//--! см. П.2.4! абсолютный! определена

! ! ! !

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

3.3. Операторы выражения

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

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

Арифметические операции выполняются над операндами в дополнительном коде по модулю 2**16 .Диапазон изменения результата представляется 16-битной величиной с диапазоном изменения от 0 до 65535.

Обобщенная форма записи оператора:

[ <арг1> ] <оп> <арг2> ,

где

<арг1> и <арг2> - аргументы оператора;

< оп > - знак или имя оператора.

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

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

Операторы с одним аргументом называются одноместными, с двумя аргументами - двухместными.

3.4. Aрифметические операторы

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

Оператор сложения может быть одноместным и двухместным.

Одноместный оператор сложения имеет следующую форму записи:

+ <арг>.

Данный оператор возвращает результат (рез), равный значению аргумента <арг> без изменений. Алгоритм выполнения оператора:

нач

тип(рез) := тип(арг)

сег(рез) := сег(арг)

фикс(рез) := фикс(арг)

вел(рез) := вел(арг)

кон

Двухместный оператор сложения имеет следующую форму записи:

<арг1> + <арг2>.

Данный оператор возвращает результат, равный сумме значений аргументов <арг1> и <арг2>. Алгоритм выполнения оператора:

нач

если тип(арг1) = число и тип(арг2) = число

то тип(рез) := число

иначе если тип(арг1) = адрес и тип(арг2) = адрес

То если сег(арг1) = сег(арг2)

То тип(рез) := адрес; сег(рез) := сег(арг1)

Иначе тип(рез) := число; сег(рез) := неопред

Все

Иначе если тип(арг1)= адрес

То тип(рез) := адрес; сег(рез) := сег(арг1)

Иначе тип(рез) := адрес; сег(рез) := сег(арг2)

Все

Все

все

если фикс(арг1) = абс и фикс(арг2) = абс

то фикс(рез) := абс

иначе если фикс(арг1) = перем и фикс(арг2) = перем

То ошибка

Иначе если фикс(арг1) = перем

То фикс(рез) := фикс(арг1)

Иначе фикс(рез) := фикс(арг2)

Все

Все

все

вел(рез) := вел(арг1) + вел(арг2)

кон

Оператор вычитания может быть одноместным и двухместным.

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

- <арг>.

Данный оператор возвращает результат, равный дополнительному коду значения аргумента <арг>. Алгоритм выполнения оператора:

нач

тип(рез) := тип(арг)

сег(рез) := сег(арг)

если фикс(арг) = перем то ошибка все

фикс(рез) := фикс(арг)

вел(рез) := 65536 - вел(арг)

кон

Двухместный оператор вычитания имеет следующую форму записи:

<арг1> - <арг2>.

Данный оператор возвращает результат, равный разности значений аргументов <арг1> и <арг2>. Алгоритм выполнения оператора:

нач

(* правила установки атрибутов "тип" и "сегмент"

Соответствуют п. 3.4.4 *)

если фикс(арг1) = абс и фикс(арг2) = абс

то фикс(рез) := абс

иначе если фикс(арг1)= перем и фикс(арг2) = абс

То фикс(рез) := фикс(арг1)

Иначе если фикс(арг1) = фикс(арг2) и

Сег(арг1) = сег(арг2)

То фикс(рез) := абс

Иначе ошибка

Все

Все

все

вел(рез) := вел(арг1) - вел(арг2)

кон

Оператор умножения имеет следующую форму записи:

<арг1> * <арг2>.

Данный оператор возвращает результат, равный произведению значений аргументов <арг1> и <арг2>. Алгоритм выполнения оператора:

нач

тип(рез) := число

сег(рез) := неопред

если фикс(арг1) = перем или фикс(арг2) = перем то ошибка все

фикс(рез) := абс

вел(рез) := вел(арг1) * вел(арг2)

кон

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

<арг1> / <арг2>.

Данный оператор возвращает результат, равный целой части, полученной от деления значения аргумента <арг1> на значение аргумента <арг2>. Значение аргумента <арг2> не может равняться нулю. Алгоритм выполнения оператора:

нач

тип(рез) := число

сег(рез) := неопред

если фикс(арг1) = перем или фикс(арг2) = перем то ошибка все

фикс(арг 1):= абс

если вел(арг2) = 0 то ошибка все

вел(рез) := вел(арг1) / вел(арг2)

кон

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

<арг1> MOD <арг2>.

Данный оператор возвращает результат, равный остатку от деления значения аргумента <арг1> на значение аргумента <арг2>. Значение аргумента <арг2> не может равняться нулю. Алгоритм выполнения оператора:

нач

тип(рез) := число

сег(рез) := неопред

если фикс(арг1) = перем или фикс(арг2) = перем то ошибка все

фикс(рез) := абс

если вел(арг2) = 0 то ошибка все

вел(рез) := вел(арг1) мод вел(арг2)

кон

Примеры выполнения арифметических операторов:

Оператор Результат выполнения

2 + 10H 0012H

65535 + 2 0001H

-0FFFFH 0001H

-2 0FFFEH

65535 - 1 0FFFEH

1 - 2 0FFFFF

7 * 5 0023H

65535 * 2 0FFFEH

2/3 0000H

255/5 0033H

2 MOD 3 0002H

3.5. Операторы сдвига

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

Оператор сдвига влево имеет следующую форму записи:

<арг1> SHL <арг2>.

Данный оператор возвращает результат, равный значению аргумента <арг1>, сдвинутому влево на число двоичных разрядов, равное значению аргумента <арг2>. Биты, выдвигаемые из старшего разряда, теряются, освободившиеся младшие разряды устанавливаются в нулевое состояние. Алгоритм выполнения оператора:

нач

тип(рез) := число

сег(рез) := неопред

если фикс(арг1) = перем или фикс(арг2) = перем то ошибка все

фикс(рез) := абс

вел(рез) := вел(арг1) * 2 ** вел(арг2)

кон

Оператор сдвига вправо имеет следующую форму записи:

<арг1> SHR <Aрг2>.

Данный оператор возвращает результат, равный значению аргумента <арг1>, сдвинутому вправо на число двоичных разрядов, равное значению аргумента <арг2>. Биты, выдвигаемые из младшего разряда, теряются. Освободившиеся старшие разряды устанавливаются в нулевое состояние. Алгоритм выполнения оператора:

нач

тип(рез) := число

сег(рез) := неопред

если фикс(арг1) = перем или фикс(арг2) = перем то ошибка все

фикс(рез) := абс

вел(рез) := вел(арг1) / 2 ** вел(арг2)

кон

Примеры выполнения операторов сдвига:

Оператор Результат выполнения

000FH SHL 2 003CH

8001H SHL 1 0002H

1234H SHR 4 0012H

5 SHR 0 0005H

3.6. Логические операторы

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

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

<арг1> OR <арг2>.

Данный оператор возвращает результат, равный поразрядной логической сумме значений аргументов <арг1> и <арг2>. Алгоритм выполнения оператора:

нач

тип(рез) := число

сег(рез) := неопред

если фикс(арг1) = перем или фикс(арг2)= перем то ошибка все

фикс(рез) := абс

вел(рез) := вел(арг1) или вел(арг2)

кон

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

<арг1> AND <арг2>.

Данный оператор возвращает результат, равный поразрядному логическому произведению аргументов <арг1> и <арг2>. Алгоритм выполнения оператора:

нач

тип(рез) := число

сег(рез) := неопред

если фикс(арг1) = перем или фикс(арг2) = перем то ошибка все

фикс(рез) := абс

вел(рез) := вел(арг1) и вел(арг2)

кон

Оператор логической инверсии имеет следующую форму записи:

NOT <арг>.

Данный оператор возвращает результат, равный поразрядной логической инверсии значения аргумента <арг>. Алгоритм выполнения оператора:

нач

тип(рез) := тип(арг)

сег(рез) := сег(арг)

если фикс(арг) = перем то ошибка все

фикс(рез) := абс

вел(рез) := не вел(арг)

кон

Оператор сложения по модулю 2 имеет следующую форму записи:

<арг1> XOR <арг2>.

Данный оператор возвращает результат, равный поразрядной сумме по модулю 2 значений аргументов <арг1> и <арг2>. Алгоритм выполнения оператора:

нач

тип(рез) := число

сег(рез) := неопред

если фикс(арг1) = перем или фикс(арг2) = перем то ошибка все

фикс(рез) := абс

вел(рез) := вел(арг1) и не вел(арг2) или

Не вел(арг 1) и вел(арг 2)

кон

Примеры выполнения логических операторов:

Оператор Результат выполнения

1200H OR 34H 1234H

3 OR 5 0007H

0FFFFH XOR 00FFH 0FF00H

0ABCDH AND 0FFH 00CDH

NOT 2 0FFFDH

3.7. Операторы отношения

В языке имеются шесть операторов отношения:

  • равно (EQ или "="),

  • не равно (NE или "<>"),

  • меньше (LT или "<"),

  • меньше или равно (LE или "<="),

  • больше (GT или ">" )

  • больше или равно (GE или ">=").

В общем случае оператор отношения имеет следующую форму записи:

<арг1> <оп> <арг2 >.

Данный оператор возвращает результат 0FFFFH, если отношение значений аргументов <арг1> и <арг2>, установленное именем оператора <оп>, истинно, или результат 0000H, если ложно. Алгоритм выполнения оператора:

нач

тип(рез) := число

сег(рез) := неопред

если фикс(арг1) = абс и фикс(арг2) = абс

то фикс(рез) := абс

иначе если фикс(арг1) = фикс(арг2) и сег(арг1)= сег(арг2)

То фикс(рез) := абс

Иначе ошибка

Все

все

выбор

При оп = "EQ" или оп = "=" :

Если вел(арг1) = вел(арг2) то вел(рез) := 0FFFFH все

При оп = "NE" или оп = "<>" :

Если вел(арг1) /= вел(арг2) то вел(рез) := 0FFFFH все

При оп = "LT" или оп = "<" :

Если вел(арг1) < вел(арг2) то вел(рез) := 0FFFFH все

При оп = "LE" или оп = "<=" :

Если вел(орг1) <= вел(арг2) то вел(рез) := 0FFFFH все

При оп = "GT" или оп = ">" :

Если вел(арг1) > вел(арг2) то вел(рез) := 0FFFFH все

При оп = "GE" или оп = ">=" :

Если вел(арг1) >= вел(арг2) то вел(рез) := 0FFFFH все

Иначе вел(рез) := 0000H

все

кон

Примеры выполнения операторов отношения:

Оператор Результат выполнения

1 EQ 0 0000H

100 = 64H 0FFFFH

3.8. Операторы выделения байтов

В языке имеются оператор выделения старшего байта HIGH и оператор выделения младшего байта LOW.

Оператор выделения старшего байта имеет следующую форму записи:

HIGH <арг>.

Данный оператор возвращает результат, равный старшим восьми битам значения аргумента <арг>. Алгоритм выполнения оператора:

нач

тип(рез) := тип(арг)

сег(рез) := сег(арг)

фикс(рез) := фикс(арг)

вел(рез) := вел(арг) / 256

кон

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

Оператор выделения младшего байта имеет следующую форму записи:

LOW <арг> .

Данный оператор возвращает результат, равный младшим восьми битам значения аргумента <арг>. Алгоритм выполнения оператора:

нач

тип(рез) := тип(арг)

сег(рез) := сег(арг)

фикс(рез) := фикс(арг)

вел(рез) := вел(арг) * 256 / 256

кон

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

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

Оператор Результат выполнения

LOW 1234H 0034H

HIGH 1234H 0012H

3.9. Правила формирования и вычисления выражений

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

LOW ( NOT ( X ) )

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

должно превышать 19.

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

Операторы выполняются слева направо в соответствии с их старшинством и правилом круглых скобок:

  1. оператор с более высоким уровнем старшинства выполняется первым из последовательности рядом стоящих операторов;

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

  3. рядом стоящие операторы с одинаковым уровнем старшинства выполняются слева направо;

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

Уровни старшинства выполнения операторов в порядке их уменьшения следующие:

уровень старшинства имя или знак оператора

1 HIGH, LOW

2 *, /, MOD, SHL, SHR

3 +, -

4 EQ, NE, LT, LE, GT, GE, =, <>, <, <=, >, >=

5 NOT

6 AND

7 OR, XOR

3.10. Типы выражений

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

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

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

Соседние файлы в папке USED