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

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

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

>macro label name

>{

> label name

> if ~ used name

>  display `name # "is defined but not used.",13,10

> end if

>}

Если метка, определенная таким макросом, не используется в коде, он известит вас об этом сообщением, указывающим, к какой метке это относится.

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

>macro message arg

>{

> if arg eqtype ""

>  local str

>  jmp @f

>  str db arg,0Dh,0Ah,24h

>  @@:

>  mov dx,str

> else

>  mov dx,arg

> end if

> mov ah,9

> int 21h

>}

Вышеописанный макрос создан для показа сообщений в программах DOS. Если аргумент этого макроса некоторое число, метка или переменная, показывается строка из этого адреса, но если аргумент — это строка в кавычках, то созданный код покажет её после … и … .

Также возможно объявить макроинструкцию внутри другой макроинструкции, то есть один макрос может определить другой, но с такими определениями есть проблема, вызванная тем, что знак «>}» не может появляться внутри макроинструкции, он всегда означает конец его определения. Чтобы обойти эту проблему, можно избавиться от мешающих символов. Это делается путем подстановки одного или больше обратных слэшей перед любыми другими символами (даже специальными знаками). Препроцессор видит эту последовательность как один символ, но каждый раз, когда он видит такой символ во время обработки макроса, он обрезает обратные слэши с его начала. Например, «>\{» трактуется как один символ, но во время обработки макроса он станет символом «>\{». Это позволит вам определить одну макроинструкцию внутри другой:

>macro ext instr

>{

> macro instr op1,op2,op3

> \{

>  if op3 eq

>   instr op1,op2

>  else

>   instr op1,op2

>   instr op2,op3

>  end if

> \}

>}

>ext add

>ext sub

Макрос «>ext» определен корректно, но когда он используется, символы «>\{» и «>\}» становятся «>{» и «>}». То есть когда обрабатывается «>ext add», содержание макроса становится действительным определением макроинструкции, и таким образом определяется макрос «>add». Так же «>ext sub» определяет макрос «>sub». Использование символа «>\{» не было здесь действительно необходимо, но сделано таким образом для того, чтобы определение было более ясным.

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

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

>macro tmacro params

>{

>macro params {

>}

>MACRO fix tmacro

>ENDM fix }

>определяет альтернативный синтаксис определения макросов, который выглядит как:

>MACRO stoschar char

>mov al,char

>stosb

>ENDM

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

2.3.4 Структуры

«>struc» — это специальный вариант директивы «>macro», который используется для определения структур данных. Макроинструкции, определенные директивой «>struc», когда используются, должны предваряться меткой (как директивы определения данных). Эта метка будет также присоединена к началу каждого имени, начинающегося с точки, в содержании макроинструкции. Макроинструкция, определенная с использованием директивы «>struc», может иметь такое же имя, как макросы, определенные с использованием директивы «>macro». Структурная макроинструкция не будет мешать обычному макросу, выполняющемуся без метки перед ним и наоборот. Все правила и свойства, касающиеся стандартных макросов, применимы к структурным макроинструкциям.

Вот пример структуры:

>struc point x,y

>{

> .x dw x

> .y dw y

>}

Например «>my point 7,11» определит структуру, помеченную «>my», содержащую две переменные: «>my.x» со значением 7 и «>my.y» со значением 11.

Еслигде-то в определении структуры находится имя, состоящие из одной лишь точки, оно заменяется на имя метки для данного примера структуры и эта метка таким образом не будет определена автоматически, позволяя полностью задать определение. Следующий пример использует это свойство, чтобы расширить определение директивы «


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

Жизнь современного человека плотно связана с видеоиграми. Даже если вы не играете сами, в вашем окружении наверняка найдутся заядлые геймеры, а новости из индустрии игр зачастую не обходят и вас стороной. Это положение дел приводит к вопросам: а что же такое видеоигры и какое место они занимают в жизни человека? Поиском ответов на них занимается дисциплина 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.