Псевдооператоры EQU и =
К простейшим макросредствам языка ассемблера можно отнести псевдооперато-
ры
и = (равно). Их мы уже неоднократно использовали при написании про-
грамм. Данные псевдооператоры предназначены для присвоения некоторому вы-
ражению символического имени или идентификатора.
когда в ходе
трансляции такие идентификаторы встречаются в теле программы, макроассемб-
лер подставляет вместо них соответствующее выражение. Выражениями могут быть
константы, имена меток, символические имена и строки в апострофах. После при-
своения этим конструкциям символических имен их можно использовать везде,
где эти конструкции могли бы присутствовать.
Синтаксис псевдооператора
строка или
Синтаксис псевдооператора =:
=
Несмотря на внешнее и функциональное сходство, псевдооператоры EQU и =
различаются следующим:
с помощью псевдооператора
идентификатору можно ставить в соответствие
как числовые выражения, так и текстовые строки, а псевдооператор = может
использоваться только с числовыми выражениями;
Ж идентификаторы, определенные с помощью псевдооператора =, можно переопре-
делять в исходном тексте программы, а определенные с использованием псев-
дооператора
— нельзя.
Ассемблер всегда пытается вычислить значение строки, воспринимая ее как
выражение. Для того чтобы строка воспринималась именно как текстовая, необхо-
димо заключить ее в угловые скобки:
<строка>
Угловые скобки являются оператором ассемблера, называемым оператором вы-
деления. С
помощью транслятору сообщается, что заключенная в угловые
скобки строка должна трактоваться как текст, даже если в нее входят служебные
слова ассемблера или операторы.
Псевдооператор EQU удобно использовать для настройки программы на кон-
кретные условия выполнения, замены сложных в обозначении объектов, много-
кратно встречающихся в программе, более простыми именами и т. п. К примеру,
model small
stack 256
296 Глава 14. Макросредства языка ассемблера
equ 10
массива
akk equ ax
регистр
equ
элемент массива
;описание массива из 10 байт:
mas db mas_size dup (0)
. code
mov
mov
mov
mov
mov
Псевдооператор = удобно использовать для определения простых абсолютных
(то есть не зависящих от места загрузки программы в память) математических
выражений. Главное условие — транслятор должен быть в состоянии вычислять
эти выражения во время трансляции. К примеру,
db 5 dup (0)
adr2
0
= 43
=
и так, через предыдущее определение
= adr2-adrl
Как видно из примера, в правой части псевдооператора = можно использовать
метки и ссылки на адреса — главное, чтобы в итоге получилось абсолютное выра-
жение.
Компилятор TASM, начиная с версии 3.00, содержит директивы, значительно
расширяющие его возможности по работе с текстовыми макросами. Эти директи-
вы аналогичны некоторым функциям обработки строк в языках высокого уровня.
Под строками здесь понимается текст, описанный с помощью псевдооператора
Эти директивы перечислены далее.
Директива слияния строк CATSTR:
идентификатор catstr
Значением этого макроса будет новая строка, состоящая из сцепленной слева
направо последовательности строк строка_1, строка_2 и т. д. В качестве сцепляе-
мых строк могут быть указаны имена ранее определенных макросов. К при-
меру,
рге equ Привет,
name equ < Юля>
privet c a t s t r
;privet= "Привет, Юля"
Директива выделения подстроки в строке
идентификатор substr
Значением данного макроса будет часть строки, заданной операндом строка,
начинающаяся с позиции с номером
и длиной, указанной опе-
рандом размер. Если требуется только остаток строки начиная с некоторой по-
зиции, то достаточно указать номер позиции (без размера). К примеру,
предыдущего фрагмента:
privet catstr
;privet= "Привет, Юля"
name substr
Директива определения вхождения одной строки в другую
идентификатор i n s t r
После обработки данного макроса транслятором операнду идентификатор будет
присвоено числовое значение, соответствующее номеру (первой) позиции,
Макрокоманды 297
с которой совпадают операнды
и строка_2. Если такого совпадения нет,
то идентификатор получит значение 0.
Директива определения длины строки в текстовом макросе
идентификатор sizestr строка
В результате обработки данного макроса значение идентификатор устанавлива-
ется равным длине строки:
продолжение предыдущего фрагмента:
privet catstr
"Привет, Юля"
sizestr privet
Эти директивы очень удобно использовать при разработке макрокоманд, кото-
рые являются следующим типом макросредств, предоставляемых компилятором
ассемблера.
Do'stlaringiz bilan baham: |