Читаем Руководство по препроцессору FASM полностью

string_table 'aaaaa','bbbbbb','5'

получим:

dd addr?00000001

dd addr?00000002

dd addr?00000003

addr?00000001 db 'aaaaa',0

addr?00000002 db 'bbbbbb',0

addr?00000003 db '5',0

Другой пример с блоком REVERSE:

macro a [x]

{

 forward

  local here

  here db x

 reverse

  dd here

}

a 1,2,3

будет:

here?00000001 db 1

here?00000002 db 2

here?00000003 db 3

dd here?00000003

dd here?00000002

dd here?00000001

Как видно, метки используется с соответствующими аргументами и в FORWARD и в REVERSE блоках.

<p>6.7. Макросы с несколькими групповыми аргументами</p>

Возможно использовать и несколько групповых аргументов. В этом случае определение макроса не будет выглядеть как:

macro a [grp1],[grp2]

так как тут не ясно какой аргумент какой группе принадлежит. Исходя из этого делают так:

Синтаксис:

macro a [grp1,grp2]

В этом случае каждый нечётный аргумент относится к группе grp1, а каждый чётный — к grp2:

macro a [grp1,grp2]

{

 forward

  l_#grp1:

 forward

  l_#grp2:

}

a 1,2,3,4,5,6

будет:

l_1:

l_3:

l_5:

l_2:

l_4:

l_6:

Или ещё:

macro ErrorList [name,value]

{

 forward

  ERROR_#name = value

}

ErrorList \

 NONE,0,\

 OUTOFMEMORY,10,\

 INTERNAL,20

получим:

ERROR_NONE = 0

ERROR_OUTOFMEMORY = 10

ERROR_INTERNAL = 20

Конечно же, может быть больше 2х групп аргументов:

macro a [g1,g2,g3]

{

 common

  db g1

  db g2

  db g3

}

a 1,2,3,4,5,6,7,8,9,10,11

будет:

db 1,4,7,10

db 2,5,8,11

db 3,6,9

<p>7. Условный препроцессинг</p>

В действительности, FASM не имеет директив для условного препроцессинга. Но директива ассемблера if может быть использована совместно с возможностями препроцессора для получения тех же результатов, что и при условном препроцессинге. (Но в этом случае увеличивается расход памяти и времени).

Как известно, оператор if обрабатывается во время ассемблирования. Это значит, что условие в этом операторе проверяется после обработки исходного текста препроцессором. Именно это обеспечивает работу некоторых логических операций.

Я не буду рассказывать о деталях времени ассемблирования (логических операциях вроде &, | и т. п.) — RTFM. Я лишь расскажу об операторах проверки условия используемых препроцессором.

<p>7.1. Оператор EQ</p>

Простейший логический оператор — это EQ. Он всего лишь сравнивает два идентификатора — одинаковы ли их значение. Значение abcd eq abcd — истина, а abcd eq 1 — ложь и так далее… Это полезно для сравнения символов, которые будут обработаны препроцессором:

STRINGS equ ASCII

if STRINGS eq ASCII

 db 'Oh yeah',0

else if STRINGS eq UNICODE

 du 'Oh yeah',0

else

 display 'unknown string type'

end if

после обработки препроцессором, это примет вид:

if ASCII eq ASCII

 db 'Oh yeah',0

else if ASCII eq UNICODE

 du 'Oh yeah',0

else

 display 'unknown string type'

end if

Здесь только первое условие (ASCII eq ASCII) выполняется, так что будет ассемблировано только db 'Oh yeah',0

Другой вариант:

STRINGS equ UNICODE  ;разница здесь, UNICODE вместо ASCII

if STRINGS eq ASCII

 db 'Oh yeah',0

else if STRINGS eq UNICODE

 du 'Oh yeah',0

else

 display 'unknown string type'

end if

получим:

if UNICODE eq ASCII

 db 'Oh yeah',0

else if UNICODE eq UNICODE

 du 'Oh yeah',0

else

 display 'unknown string type'

end if

Тут уже первое условие (UNICODE eq ASCII) будет ложно, второе (UNICODE eq UNICODE) — верно, будет ассемблироваться du 'Oh yeah',0.

Несколько лучшее применение этого — проверка аргументов макросов, вроде:

macro item type,value

{

 if type eq BYTE

  db value

 else if type eq WORD

  dw value

 else if type eq DWORD

  dd value

 else if type eq STRING

  db value,0

 end if

}

item BYTE,1

item STRING,'aaaaaa'

будет:

if BYTE eq BYTE

 db 1

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных