Flat Assembler 1.64. Мануал программера - [9]

Шрифт
Интервал

>d equ dword

>p equ pword

>f equ fword

>q equ qword

>t equ tword

>x equ dqword

Так как символьная константа может так же иметь пустое значение, она может использоваться для того, чтобы допустить синтаксис со словом «>offset» перед каким-нибудь значением адреса:

>offset equ

После такого определения «>mov ax, offset char» будет правильной конструкцией, которая будет копировать смещение переменной «>char» в регистр «>ax», так как «>offset» заменяется пустым значением, и поэтому игнорируется.

Символьные константы могут также быть определены директивой «>fix», которая имеет такой же синтаксис, как «>equ», но определяет константы высшего приоритета — они заменяются их символическим значением даже перед совершением директив препроцессора и макроинструкций. Исключением является сама директива «>fix», которая имеет наивысший возможный приоритет, и поэтому допускает переопределение констант, заданных таким путем. Но если такие константы высшего приоритета находятся внутри значения, следующего за директивой «>fix», они заменяются их значениями перед присвоением этого значения новой константе.

Директива «>fix» может использоваться для адаптирования директив препроцессора, что нельзя сделать директивой «>equ». Например:

>incl fix include

определяет короткое имя для директивы «>include», тогда как такое же определение директивой «>equ» не даст такого результата, так как стандартные символьные константы заменяются на из значения после поиска строк с директивами препроцессора.

2.3.3 Макроинструкции

«>macro» позволяет вам определить собственный комплекс инструкций, называемых макроинструкциями. Их использование может существенно упростить процесс программирования. В своей простейшей форме директива похожа на описание символьной константы. Например, следующая строка определяет ярлык для инструкции «>test al,0xFF»:

>macro tst {test al,0xFF}

После директивы «>macro» должно идти имя макроинструкции и далее её содержание, заключенное между знаками «>{» и «>}». Вы можете использовать инструкцию «>tst» в любом месте после её определения и она будет ассемблирована как «>test al,0xFF». Определение символьной константы с таким значением даст похожий результат, различие лишь в том, что имя макроинструкции будет распознаваться только как мнемоник инструкции. Также, макроинструкции заменяются соответствующим кодом даже перед заменой символьных констант на их значения. То есть, если вы вы определите макроинструкцию и символьную константу под одним и тем же именем и используете это имя как мнемоник инструкции, оно будет заменено на содержание макроинструкции, но если вы используете его внутри операндов, имя будет заменено на значение символьной константы.

Определение макроинструкции может сотоять из нескольких строк, потому что знаки «>{» и «>}» не обязательно должны находиться на одной строке директивой «>macro». Например:

>macro stos0

>{

> xor al,al

> stosb

>}

Макроинструкция «>stos0» будет заменена на эти две инструкции ассемблера, где бы он не использовался.

Как и инструкции, которым требуются несколько операндов, для макроинструкции можно задать требование нескольких аргументов, разделяя их запятыми. Имена этих аргументов должны следовать за именем макроинструкции на строке с директивой «>macro». В любом месте в макроинструкции, где эти имена появятся, они будут заменены соостветствующими значениями, указанными там, где макроинструкция используется. Вот пример макроинструкции, которая делает выравнивание данных для двоичного формата вывода:

>macro align value { rb (value-1)-($+value-1) mod value }

Когда инструкция «>align 4» встречается после этого задания макроинструкции, она заменяется на его содержание, и здесь «>value» станет 4, а результат будет «>rb (4–1)-($+4–1) mod 4».

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

>macro mov op1,op2

>{

> if op1 in

>  & op2 in

>  push op2

>  pop op1

> else

>  mov op1,op2

>end if

>}

Эта макроинструкция расширяет синтаксис инструкции «>mov», позволяя обоим операндам быть сегментными регистрами. Например, «>mov ds,es» будет ассемблировано как «>push es» и «>pop ds». Во всех других случаях будет использована стандартная инструкция «>mov». Синтаксис этого «>mov» может быть расширен далее определением следующей макроинструкции с таким именем, который будет использовать предыдущий:

>macro mov op1,op2,op3

>{

> if op3 eq

>  mov op1,op2

> else

>  mov op1,op2

>  mov op2,op3

>end if

>}

Это позволяет инструкции «>mov» иметь три операнда, но она так же все ещё может иметь два операнда, так как если макроинструкции задается меньше аргументов, чем ему требуется, оставшиеся заполняются пустыми значениями. Если заданы три операнда, то макроинструкция превратится в две ранее определенных, то есть «>mov es,ds,dx» будет ассемблировано как «>push ds», «>pop es» и «>mov ds,dx».

Если требуется создать макроинструкцию с аргументом, который содержит запятые, этот аргумент следует заключить между «><» и «>>». Если он содержит больше одного знака «><», то для окончания его описания должно быть использовано такое же количество «


Рекомендуем почитать
Игродром. Что нужно знать о видеоиграх и игровой культуре

Жизнь современного человека плотно связана с видеоиграми. Даже если вы не играете сами, в вашем окружении наверняка найдутся заядлые геймеры, а новости из индустрии игр зачастую не обходят и вас стороной. Это положение дел приводит к вопросам: а что же такое видеоигры и какое место они занимают в жизни человека? Поиском ответов на них занимается дисциплина game studies. Александр Ветушинский – один из ведущих российских представителей этого направления исследований. Его книга «Игродром» – философское осмысление этапов развития игровой индустрии, анализ.


Выразительный JavaScript

В процессе чтения вы познакомитесь с основами программирования и, в частности, языка JavaScript, а также выполните несколько небольших проектов. Один из самых интересных проектов — создание своего языка программирования.


Темные данные. Практическое руководство по принятию правильных решений в мире недостающих данных

Человечество научилось собирать, обрабатывать и использовать в науке, бизнесе и повседневной жизни огромные массивы данных. Но что делать с данными, которых у нас нет? Допустимо ли игнорировать то, чего мы не замечаем? Британский статистик Дэвид Хэнд считает, что это по меньшей мере недальновидно, а порой – крайне опасно. В своей книге он выделяет 15 влияющих на наши решения и действия видов данных, которые остаются в тени. Например, речь идет об учете сигналов бедствия, которые могли бы подать жители бедных районов, если бы у них были смартфоны, результатах медицинского исследования, которые намеренно утаили или случайно исказили, или данных, ставших «темными» из-за плохого набора критериев для включения в выборку.


S. D. F.

Если вам интересен SQL, и знаком Delphi, давайте поразвлекаемся программированием.


Справка по SQL

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


Обработка баз данных на Visual Basic.NET

Это практическое руководство разработчика программного обеспечения на Visual Basic .NET и ADO.NET, предназначенное для создания приложений баз данных на основе WinForms, Web-форм и Web-служб. В книге описываются практические способы решения задач доступа к данным, с которыми сталкиваются разработчики на Visual Basic .NET в своей повседневной деятельности. Книга начинается с основных сведений о создании баз данных, использовании языка структурированных запросов SQL и системы управления базами данных Microsoft SQL Server 2000.