- Арифметические операторы
- Операторы сдвига
- Операторы сравнения
- Логические операторы
- Индексный оператор
- Оператор переопределения типа
- Оператор переопределения сегмента
- Оператор именования типа структуры
- Оператор получения сегментной составляющей адреса выражения
- Оператор получения смещения выражения
Арифметические операторы. К ним относятся:
унарные “+” и “–”;
- бинарные “+” и “–”;
- умножения “*”;
- целочисленного деления “/”;
- получения остатка от деления “mod”.
tab_size equ 50 ;размер массива в байтах
size_el equ 2 ;размер элементов
…
;вычисляется число элементов массива
;и заносится в регистр cx
mov cx,tab_size / size_el ;оператор “/”
Операторы сдвига выполняют сдвиг выражения на указанное количество разрядов.

mask_b equ 10111011
…
mov al,mask_b shr 3 ;al=00010111
Операторы сравнения (возвращают значение “истина” или “ложь”) предназначены для формирования логических выражений (см. табл.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.
Таблица 1. Операторы сравнения
Оператор | Значение |
eq | ИСТИНА, если выражение_1 равно выражение_2 |
ne | ИСТИНА, если выражение_1 не равно выражение_2 |
lt | ИСТИНА, если выражение_1 меньше выражение_2>ИСТИНА, если выражение_1 не равно выражение_2 |
le | ИСТИНА, если выражение_1 меньше или равно выражение_2 |
gt | ИСТИНА, если выражение_1 больше выражение_2 |
ge | ИСТИНА, если выражение_1 больше или равно выражение_2 |
Логические операторы выполняют над выражениями побитовые операции. Выражения должны быть абсолютными, то есть такими, численное значение которых может быть вычислено транслятором.

flags equ 10010011
mov al,flags xor 01h ;
al=10010010;пересылка в al поля flags с
;инвертированным правым битом
Индексный оператор [ ]. Не удивляйтесь, но скобки тоже являются оператором, и транслятор их наличие воспринимает как указание сложить значение выражение_1 за этими скобками с выражение_2, заключенным в скобки.

mov ax,mas[si] ;пересылка слова по адресу
;mas+(si) в регистр ax
Заметим, что в литературе по ассемблеру принято следующее обозначение: когда в тексте речь идет о содержимом регистра, то его название берут в круглые скобки. Мы также будем придерживаться этого обозначения.
К примеру, в нашем случае запись в комментариях последнего фрагмента программы mas + (si) означает вычисление следующего выражения: значение смещения символического имени mas плюс содержимое регистра si.
Оператор переопределения типа ptr применяется для переопределения или уточнения типа метки или переменной, определяемых выражением. Тип может принимать одно из следующих значений: 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 позволяет непосредственно в команде переопределить тип и выполнить команду.
Оператор переопределения сегмента : (двоеточие) заставляет вычислять физический адрес относительно конкретно задаваемой сегментной составляющей: “имя сегментного регистра”, “имя сегмента” из соответствующей директивы SEGMENT или “имя группы”.

А что же с сегментом стека? Вспоминаем что уже писалось про регистры. В контексте нашего рассмотрения нас интересуют регистры sp и bp. Если микропроцессор видит в качестве операнда (или его части, если операнд — выражение) один из этих регистров, то по умолчанию он формирует физический адрес операнда используя в качестве его сегментной составляющей содержимое регистра ss. Что подразумевает термин “по умолчанию”? Это набор микропрограмм в блоке микропрограммного управления, каждая из которых выполняет одну из команд в системе машинных команд микропроцессора. Каждая микропрограмма работает по своему алгоритму. Изменить его, конечно же, нельзя, но можно чуть-чуть подкорректировать. Делается это с помощью необязательного поля префикса машинной команды. Если мы согласны с тем, как работает команда, то это поле отсутствует. Если же мы хотим внести поправку (если, конечно, она допустима для конкретной команды) в алгоритм работы команды, то необходимо сформировать соответствующий префикс.
Префикс представляет собой однобайтовую величину, численное значение которой определяет ее назначение. Микропроцессор распознает по указанному значению, что этот байт является префиксом, и дальнейшая работа микропрограммы выполняется с учетом поступившего указания на корректировку ее работы. Сейчас нас интересует один из них - префикс замены (переопределения) сегмента. Его назначение состоит в том, чтобы указать микропроцессору (а по сути, микропрограмме) на то, что мы не хотим использовать сегмент по умолчанию. Возможности для подобного переопределения, конечно, ограничены. Сегмент команд переопределить нельзя, адрес очередной исполняемой команды однозначно определяется парой cs:ip. А вот сегменты стека и данных — можно. Для этого и предназначен оператор “:”. Транслятор ассемблера, обрабатывая этот оператор, формирует соответствующий однобайтовый префикс замены сегмента.
Пример:
.code
...
jmp met1 ;обход обязателен, иначе поле ind
;будет трактоваться как очередная команда
ind db 5 ;описание поля данных в сегменте команд
met1:
...
mov al,cs:ind ;переопределение сегмента
;позволяет работать с данными,
;определенными внутри сегмента кода
Оператор именования типа . (точка) также заставляет транслятор производить определенные вычисления, если он встречается в выражении.
Оператор получения сегментной составляющей адреса выражения seg возвращает физический адрес сегмента для выражения, в качестве которого могут выступать метка, переменная, имя сегмента, имя группы или некоторое символическое имя.


.data
pole dw 5
...
.code
...
mov ax,seg pole
mov es,ax
mov dx,offset pole ;теперь в паре es:dx
;полный адрес pole
Как и в языках высокого уровня, выполнение операторов ассемблера при вычислении выражений осуществляется в соответствии с их приоритетами (см. табл. 2). Операции с одинаковыми приоритетами выполняются последовательно слева направо. Изменение порядка выполнения возможно путем расстановки круглых скобок, которые имеют наивысший приоритет.
Таблица 2. Операторы и их приоритет
Оператор | Приоритет |
length, size, width, mask, (, ), [, ], <, > | 1 |
. | 2 |
: | 3 |
ptr, offset, seg, 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 |
Комментариев нет:
Отправить комментарий