Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / Лекция 2 / Лекция 2.doc
Скачиваний:
40
Добавлен:
10.06.2015
Размер:
240.64 Кб
Скачать

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

Операнд команды может быть выражением, представляющим собой комбинацию операндов и операторов ассемблера. Транслятор ассемблера рассматривает выражение как единое целое и преобразует его в числовую константу. Логически значением этой константы может быть адрес некоторой ячейки памяти или некоторое абсолютное значение.

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

Таблица 5.1. Операторы и их приоритет

Оператор

Приоритет

LENGTH, SIZE, WIDTH, MASK, (, ), [, ], <, >

1

.

2

:

3

PTR, OFFSET, SEC, TYPE, THIS

4

HIGH, LOW

5

+, - (унарные)

6

*,/,MOD,SHL, SHR

7

+, - (бинарные)

8

EQ, NE, LT, LE, GT, GE

9

NOT

10

AND

11

OR, XOR

12

SHORT, TYPE

13

Дадим краткую характеристику операторов.

Арифметические операторы. К арифметическим операторам относятся унарные и бинарные операторы «плюс» (+) и «минус» (-), а также операторы умножения (*), целочисленного деления (/), получения остатка от деления (MOD). Эти операторы в табл. 5.1 соответствуют уровням приоритета 6, 7, 8.

Например,

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

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

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

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

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

mask_b equ 10111011

mov al.mask b shr 3 ;al=00010111

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

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

mov al,tab_size ge 50 ; загрузка размера таблицы в al

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

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

mi: ...

В этом примере, если значение tab_size больше или равно 50, то результат в AL равен 0ffh, а если tab_size меньше 50, то результат в AL равен ООН. Команда СМР сравнивает значение AL с нулем и устанавливает соответствующие флаги в FLAGS/EFLAGS. Команда JE на основе анализа этих флагов передает или не передает управление на метку ml.

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

Оператор

Значение

Eq

Истина, если выражение_1 равно выражение_2

Ne

Истина, если выражение_1 не равно выражение_2

Lt

Истина, если выражение 1 меньше выражение_2

Le

Истина, если выражение 1 меньше или равно выражение_2

Gt

Истина, если выражение 1 больше выражение 2

Ge

Истина, если выражение_1 больше или равно выражение_2

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

flags equ 10010011

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

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

Индексный оператор.Квадратные скобки транслятор воспринимает как указание сложить значение выражение..! за этими скобками со значением выражение_2, заключенным в скобки. Например,

mov a x , m a s [ s i ] ; пересылка слова по адресу mas + (si) в регистр ах

Оператор переопределения типа PTR применяется для переопределения или уточнения типа метки (или переменной), определяемой выражением. Тип может принимать одно из следующих значений: BYTE, WORD, DWORD, QWORD, TBYTE, NEAR, FAR.

Например,

d_wrd dd 0

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

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

Оператор переопределения сегмента заставляет вычислять физический адрес относительно конкретно задаваемой сегментной составляющей: «имя сегментного регистра», «имя сегмента» из соответствующей директивы SEGMENT или «имя группы».

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

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

.code

jmp metl ; обход обязателен, иначе поле ind

; будет трактоваться как очередная команда

ind db 5 ; описание поля данных в сегменте команд,

metl:

mov al,cs:ind ; переопределение сегмента позволяет работать с данными,

; определенными внутри сегмента кода

Продолжим перечисление операторов.

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

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

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

Например,

.data

pole dw s

.code

mov ax.seg pole

mov es.ax

mov dx,offset pole ;теперь в паре es:dx полный адрес pole

Соседние файлы в папке Лекция 2