Операнды-выражения
Таблица 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 10111011mov а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
Еще по теме Операнды-выражения:
- Модус операнди
- Разговорные фразы и выражения
- Разговорные фразы и выражения
- Правило выражения глаз
- Код выражения лица
- Код выражения лица
- Код выражения лица
- Код выражения лица
- ЧИТАЯ КОД ВЫРАЖЕНИЯ ЛИЦА
- ЧИТАЯ КОД ВЫРАЖЕНИЯ ЛИЦА
- Код выражения лица
- Код выражения лица