REFERATUA.ORG.UA — База українських рефератів




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

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

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

Арифметические операторы Операторы сдвига Операторы сравнения Логические операторы Индексный оператор Оператор переопределения типа Оператор переопределения сегмента Оператор именования типа структуры Оператор получения сегментной составляющей адреса выражения Оператор получения смещения выражения

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

  • Арифметические операторы. К ним относятся:

    • унарные "+" и "-";

    • бинарные "+" и "-";

    • умножения "*";

    • целочисленного деления "/";

    • получения остатка от деления "mod".

Эти операторы расположены на уровнях приоритета 6, 7, 8 в табл. 2. Например,

tab_size equ 50 ;размер массива в байтах

size_el equ 2 ;размер элементов

:

;вычисляется число элементов массива и заносится в

регистр cx

mov cx,tab_size / size_el ;оператор "/"

  • Рис. 5. Синтаксис арифметических операций

  • Операторы сдвига выполняют сдвиг выражения на указанное количество разрядов (рис. 6). Например,

mask_b equ 10111011

:

mov al,mask_b shr 3 ;al=00010111

Assembler

  • Рис. 6. Синтаксис операторов сдвига

  • Операторы сравнения (возвращают значение "истина" или "ложь") предназначены для формирования логических выражений (см. рис. 7 и табл. 1). Логическое значение "истина" соответствует цифровой единице, а "ложь" - нулю. Например,

    tab_size equ 30 ;размер таблицы

    :

    mov al,tab_size ge 50 ;загрузка размера

    таблицы в al

    cmp al,0 ;если tab_size < 50, то

    je m1 ;переход на m1

    :

    m1: :

  • В этом примере если значение tab_size больше или равно 50, то результат в al равен 0ffh, а если tab_size меньше 50, то al равно 00h. Команда cmp сравнивает значение al с нулем и устанавливает соответствующие флаги в flags/eflags. Команда je на основе анализа этих флагов передает или не передает управление на метку m1.

  • Assembler

  • Рис. 7. Синтаксис операторов сравнения

Таблица 1. Операторы сравнения

Оператор

Значение

eq

ИСТИНА, если выражение_1 равно выражение_2

ne

ИСТИНА, если выражение_1 не равно выражение_2

lt

ИСТИНА, если выражение_1 меньше выражение_2>ИСТИНА, если выражение_1 не равно выражение_2

le

ИСТИНА, если выражение_1 меньше или равно выражение_2

gt

ИСТИНА, если выражение_1 больше выражение_2

ge

ИСТИНА, если выражение_1 больше или равно выражение_2

  • Логические операторы выполняют над выражениями побитовые операции (рис. 8). Выражения должны быть абсолютными, то есть такими, численное значение которых может быть вычислено транслятором. Например:

flags equ 10010011

mov al,flags xor 01h ;al=10010010;пересылка в al поля flags с

;инвертированным пр

авым битом

Assembler

  • Рис. 8. Синтаксис логических операторов

  • Индексный оператор[ ]. Не удивляйтесь, но скобки тоже являются оператором, и транслятор их наличие воспринимает как указание сложить значение выражение_1 за этими скобками с выражение_2, заключенным в скобки (рис. 9). Например,

    mov ax,mas[si] ;пересылка слова по адресу mas+(si) в регистр ax

  • Assembler

  • Рис. 9. Синтаксис индексного оператора

  • Заметим, что в литературе по ассемблеру принято следующее обозначение: когда в тексте речь идет о содержимом регистра, то его название берут в круглые скобки. Мы также будем придерживаться этого обозначения.
    К примеру, в нашем случае запись в комментариях последнего фрагмента программы mas + (si) означает вычисление следующего выражения: значение смещения символического имени mas плюс содержимое регистра si.

  • Оператор переопределения типаptr применяется для переопределения или уточнения типа метки или переменной, определяемых выражением (рис. 10).
    Тип может принимать одно из следующих значений: byte, word, dword, qword, tbyte, near, far. Например,

    d_wrd dd 0

    ...

    mov al,byte ptr d_wrd+1 ;пересылка второго байта из двойного слова

  • Поясним этот фрагмент программы. Переменная d_wrd имеет тип двойного слова. Что делать, если возникнет необходимость обращения не ко всей переменной, а только к одному из входящих в нее байтов (например, ко второму)? Если попытаться сделать это командой
    mov al,d_wrd+1, то транслятор выдаст сообщение о несовпадении типов операндов. Оператор ptr позволяет непосредственно в команде переопределить тип и выполнить команду.

  • Assembler

  • Рис. 10. Синтаксис оператора переопределения типа

  • Оператор переопределения сегмента: (двоеточие) заставляет вычислять физический адрес относительно конкретно задаваемой сегментной составляющей: "имя сегментного регистра", "имя сегмента" из соответствующей директивы SEGMENT или "имя группы" (рис. 11). Этот момент очень важен, поэтому поясню его подробнее. При обсуждении сегментации мы говорили о том, что микропроцессор на аппаратном уровне поддерживает три типа сегментов - кода, стека и данных. В чем заключается такая аппаратная поддержка? К примеру, для выборки на выполнение очередной команды микропроцессор должен обязательно посмотреть содержимое сегментного регистра cs и только его. А в этом регистре, как мы знаем, содержится (пока еще не сдвинутый) физический адрес начала сегмента команд. Для получения адреса конкретной команды микропроцессору остается умножить содержимое cs на 16 (что означает сдвиг на четыре разряда) и сложить полученное 20-битное значение с 16-битным содержимым регистра ip. Примерно то же самое происходит и тогда, когда микропроцессор обрабатывает операнды в машинной команде. Если он видит, что операнд - это адрес (эффективный адрес, который является только частью физического адреса), то он знает, в каком сегменте его искать - по умолчанию это сегмент, адрес начала которого записан в сегментном регистре ds.
    А что же с сегментом стека? Посмотрите раздел "Программная


 
Загрузка...