<<
>>

Операнды-выражения

Операнд команды может быть выражением, представляющим собой комбинацию операндов и операторов ассемблера. Транслятор ассемблера рассматривает выра- жение как единое целое и преобразует его в числовую константу.
Логически зна- чением этой константы может быть адрес некоторой ячейки памяти или некото- рое абсолютное значение. Перечислим возможные типы операторов ассемблера (ТASM) и синтаксиче- ские правила формирования выражений ассемблера. Как и в языках высокого уров- ня, выполнение операторов ассемблера при вычислении выражений осуществля- ется в соответствии с их приоритетами (табл. 5.1). Операторы с одинаковыми приоритетами обрабатываются последовательно слева направо. Изменение порядка выполнения возможно путем расстановки круглых скобок, которые имеют наи- высший приоритет.
Таблица 5.1. Операторы и их приоритет 4 Зак. 256

Т аблица 5.1 (продолжение)

Дадим краткую характеристику операторов. В приложении Б (httр://www.рitеr. com/download) для сравнения и информации приведены сведения об операторах и предопределенных символах транслятора МАSМ. 9 Арифметические операторы (рис. 5.5). К арифметическим операторам относят- ся унарные и бинарные операторы «плюс» (+) и «минус» (-), а также операто- ры умножения (*), целочисленного деления (/), получения остатка от деления (MOD). Эти операторы в табл. 5.1 соответствуют уровням приоритета 6, 7, 8. Например, tаb_sizееqu 50 ; размер массива в байтах sizе_еl еqu 2 ; размер элементов

; вычисляется число элементов массива и заносится в регистр сх mоv сх,tаb_sizе ∕ sizе_еl ; оператор "/"

Ш Операторы сдвига выполняют сдвиг выражения на указанное количество раз- рядов (рис.

5.6). Например, mаsk_b еqu 10111011
mov аl,mаsk_b shr 3 ;al=00010111 Рис. 5.6. Синтаксис операторов сдвига

s[2] Операторы сравнения возвращают значение «истина» или «ложь» и предназна- чены для формирования логических выражений (рис. 5.7 и табл. 5.2). Логическое значение «истина» соответствует логической единице, а «ложь» — логическому нулю. Логическая единица — значение, все биты которого равны 1, соответствен- но, логический нуль — значение, все биты которого равны 0. Например, tаb_sizееqu 30 ; размер таблицы mov al,tab_size gе 50 ; загрузка размера таблицы в аl сmр аl,О ; если tаb_sizе < 50. то je ml ; переход на ml mi: ... . В этом примере, если значение tаb_sizе больше или равно 50, то результат в AL равен Оffh, а если tаb_sizе меньше 50, то результат в AL равен 00h. Команда СMР сравнивает значение AL с нулем и устанавливает соответствующие флаги в FLAGS/ EFLAGS. Команда JЕ на основе анализа этих флагов передает или не передает управление на метку ml.

Рис. 5.7. Синтаксис операторов сравнения Таблица 5.2. Операторы сравнения

⅞ Индексный оператор. Как показано на рис. 5.9, квадратные скобки транслятор воспринимает как указание сложить значение выражение_l за этими скобками со значением выражение_2, заключенным в скобки. Например, mov ах,mаs[si] ; пересылка слова по адресу mas + (si) в регистр ах ® Оператор переопределения сегмента заставляет вычислять физический адрес относительно конкретно задаваемой сегментной составляющей: «имя сегмент- ного регистра», «имя сегмента» из соответствующей директивы SEGMENT или «имя группы» (рис.

5.11).
Рис. 5.11. Синтаксис оператора переопределения сегмента

Этот момент важен, поэтому поясним его подробнее. При обсуждении сегмен- тации (см. главу 2) упоминалось о том, что процессор на аппаратном уровне под- держивает три типа сегментов — кода, стека и данных. В чем заключается такая аппаратная поддержка? К примеру, для выборки на выполнение очередной коман- ды процессор должен обязательно посмотреть содержимое сегментного регистра CS, и только его. В этом регистре содержится информация о начале сегмента ко- манд. В реальном режиме работы процессора в сегментном регистре CS находится не сдвинутый на четыре бита влево физический адрес начала сегмента. Для полу- чения адреса конкретной команды процессору остается умножить содержимое CS на 16 (что означает сдвиг на четыре разряда) и сложить полученное 20-разрядное значение с 16-разрядным содержимым регистра IP. Примерно то же самое проис- ходит и тогда, когда процессор обрабатывает операнды в машинной команде. Если он видит, что операнд — это адрес (эффективный адрес, который является только частью физического адреса), то он знает, в каком сегменте его искать, — по умол- чанию это сегмент, адрес начала которого записан в сегментном регистре DS. В за- щищенном режиме сегментные регистры содержат селекторы, с помощью кото- рых также можно получить доступ к информации об адресе начала сегмента. А что же с сегментом стека? Для большей ясности стоит вернуться к вопросу о регистрах общего назначения (см. главу 2). В контексте нашего рассмотрения ин- терес представляют регистры SP и ВР. Если процессор видит в качестве операнда (или его части, если операнд — выражение) один из этих регистров, то по умолча- нию он формирует физический адрес операнда, используя содержимое регистра SS как сегментную составляющую этого адреса. Что подразумевает термин «по умолчанию»? Вспомним (см.

главу 1) набор микропрограмм в блоке микропро- граммного управления, каждая из которых выполняет одну из команд в системе машинных команд процессора. Каждая микропрограмма работает по своему алго- ритму. Изменить его, конечно же, нельзя, но можно чуть-чуть подкорректировать. Делается это с помощью необязательного поля префикса машинной команды (см. раздел «Формат машинных команд IA-32» в главе 3). Если программист согласен с тем, как работает команда, то это поле отсутствует. Если же есть необходимость внести поправку (если, конечно, она допустима для конкретной команды) в алго- 102 Глава 5. Синтаксис ассемблера ритм работы команды, то необходимо сформировать соответствующий префикс. Префикс представляет собой однобайтовую величину, численное значение кото- рой определяет ее назначение. Процессор распознает по указанному значению, что этот байт является префиксом, и дальнейшая работа микропрограммы выполня- ется с учетом поступившего указания на корректировку ее работы. В главе 3 мы перечислили все возможные префиксы машинных команд. В контексте нашего обсуждения интерес представляет один из них — префикс замены сегмента. Его назначение состоит в том, чтобы указать процессору (а по сути, микропрограмме) на то, что мы не хотим использовать сегмент по умолчанию. Возможности для по- добного переопределения, конечно, ограничены. Сегмент команд переопределить нельзя, адрес очередной исполняемой команды однозначно определяется парой CS:IP. А вот сегменты стека и данных — можно. Для этого и предназначен оператор переопределения сегмента (:). Транслятор ассемблера, обрабатывая этот оператор, формирует соответствующий однобайтовый префикс замены сегмента и ставит его перед машинным представлением соответствующей команды ассемблера. Например, .code jmp neti ; обход обязателен, иначе поле ind ; будет трактоваться как очередная команда iпd db 5 ; описание поля данных в сегменте команд, metl: mov аl,сs:iпd ; переопределение сегмента позволяет работать с данными, ; определенными внутри сегмента кода Продолжим перечисление операторов. я Оператор именования типа структуры также заставляет транслятор произво- дить определенные вычисления, если он встречается в выражении. Подробно этот оператор (.) описывается в главе 13 при обсуждении сложных типов дан- ных.

S! Оператор получения сегментной составляющей адреса выражения возвращает физический адрес сегмента для выражения, в качестве которого могут высту- пать метка, переменная, имя сегмента, имя группы или некоторое символиче- ское имя (рис. 5.12). ⅜ Оператор получения смещения выражения позволяет получить значение сме- щения выражения в байтах относительно начала того сегмента, в котором вы- ражение определено (рис. 5.13). Рис. 5.13. Синтаксис оператора получения смещения Директивы сегментации 103

<< | >>
Источник: В. И. Юров. Assembler. Учебник для вузов. 2-е изд. 2003

Еще по теме Операнды-выражения:

  1. Модус операнди
  2. Разговорные фразы и выражения
  3. Разговорные фразы и выражения
  4. Правило выражения глаз
  5. Код выражения лица
  6. Код выражения лица
  7. Код выражения лица
  8. Код выражения лица
  9. ЧИТАЯ КОД ВЫРАЖЕНИЯ ЛИЦА
  10. ЧИТАЯ КОД ВЫРАЖЕНИЯ ЛИЦА
  11. Код выражения лица
  12. Код выражения лица