Читаем Макросы и директивы компилятора FASM полностью

stosb

mov al,3

stosb

Есть некоторые специальные директивы, располагаемые только в определениях макросов. Директива local определяет локальные имена, которые будут заменены новыми значениями каждый раз, когда используется макрос. Она должна сопровождаться именами, отделенными запятыми. Эта директива обычно нужна для констант или меток которые макрос определяет и использует внутри себя. Например:

macro movstr

 {

      local move

  move:

      lodsb

      stosb

      test al,al

      jnz move

 }

При использовании этого макроса метка move всегда имеет свое уникальное значение и повторение этого макроса не вызовет ошибок.

Директивы forward, reverse

и common делят макрос на блоки, каждый обрабатывается после того, как обработка предыдущих закончена. Они отличаются по поведению, только если макрос позволяет множественные группы аргументов. Блок инструкций, что следует за директивой forward, будет обработан для каждой группы аргументов с первого до последнего — наподобие обычному блоку (не заданному в соответствии с любой из этих директив). Блок, который следует за директивой reverse, будет обработан для каждой группы аргумента в обратном порядке — от последнего до первого. Блок, который следует за директивой common, будет обработан только однажды, сразу для всех групп аргументов. Значение local, определенное в одном из блоков доступно во всех следующих блоках при обработке той же самой группы аргументов где оно было определено, когда оно определено в блоке common, оно доступно во всех следующих блоках независимо какая группа аргументов обрабатывается.

Вот пример макроса, который создаст таблицу адресов к строкам, заданных этими строками:

macro strtbl name,[string]

 {

  common

      label name dword

  forward

      local label

      dd label

  forward

      label db string,0

 }

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

macro stdcall proc,[arg]

 {

  reverse push arg

  common call proc

 }

Этот макрос может использоваться для вызова процедур, использующих соглашение STDCALL, где аргументы сохраняются на стек в обратном порядке. Для примера stdcall foo, 1,2,3 будет собран как:

push 3

push 2

push 1

call foo

Если некоторое имя в макросе имеет множественные параметры (одним из аргументов, огороженных в квадратные скобки или локальным именем, определенным в блоке, следующем за директивой forward или reverse

) и используется в блоке, следующем за директивой common, это имя будет заменено всеми ее величинами, отделенными запятыми. Например следующий макрос передаст все дополнительные аргументы предварительно заданному макросу stdcall:

macro invoke proc,[arg]

 { common stdcall [proc],arg }

Это может использоваться, чтобы вызывать косвенно (по указателю, находящемуся в памяти) процедуру, используя соглашение STDCALL.

Внутри макроса существует также специальный оператор #. Этот оператор связывает два имени в одно. Это может быть полезно, потому что это делается после того, как аргументы и локальные имена меняются на их настоящие значения. Следующий макрос произведет условный переход согласно аргументу cond:

macro jif op1,cond,op2,label

 {

      cmp op1,op2

      j#cond label

 }

К примеру jif ax,ae,10h,exit будет скомпилировано как cmp ax,10h

и jae exit.

Чтобы сделать макрос, ведущий себя в зависимости от типа аргумента, когда аргументы — строки или нет, Вы может использовать факт, что ассемблер отличает напрямую указанные строки от указанных строк в численных выражениях, но не отличает численное выражение, которому предшествуют знак + от того же самого выражения без знака. Так строка, которой предшествуют + со знаком будут обрабатывать как численное выражение и не будет символически равен той же самой строке без любого знака, в то время как любая другая величина будет символически равна тому же самому выражению, которому предшествуют + знак. Вот пример макроса, использующий эту особенность:

macro message arg

 {

  if arg eq +arg

      mov dx,arg

  else

      local str

      jmp @f

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

      @@:

      mov dx,str

  end if

      mov ah,9 int 21h

 }

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

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

97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT
Язык программирования Euphoria. Справочное руководство
Язык программирования Euphoria. Справочное руководство

Euphoria (юфо'ри, также рус. эйфори'я, ра'дость) — язык программирования, созданный Робертом Крейгом (Rapid Deployment Software) в Канаде, Торонто. Название Euphoria — это акроним для «End-User Programming with Hierarchical Objects for Robust Interpreted Applications».Euphoria — интерпретируемый императивный язык высокого уровня общего назначения. C помощью транслятора из исходного кода на Euphoria может быть сгенерирован исходный код на языке Си, который в свою очередь может быть скомпилирован в исполнияемый файл или динамическую библиотеку при помощи таких компиляторов, как GCC, OpenWatcom и др. Программа Euphoria также может быть «связана» с интерпретатором для получения самостоятельного исполняемого файла. Поддерживается несколько GUI-библиотек, включая Win32lib и оберток для wxWidgets, GTK+ и IUP. Euphoria имеет встроенную простую систему баз данных и обертки для работы с другими типам баз данных.[Материал из Википедии]

Коллектив авторов

Программирование, программы, базы данных
Модель зрелости процессов разработки программного обеспечения
Модель зрелости процессов разработки программного обеспечения

Данный текст является переводом на русский язык описания одного из самых популярных стандартов постановки процесса разработки программного обеспечения (ПО).Я публикую книгу на своем сайте в открытом доступе для того, чтобы все интересующиеся данным вопросом могли прочитать ее и получить необходимую информацию совершенно свободно и бесплатно. Причина в том, что те методики, которые описаны в данном стандарте, как я считаю, просто обязаны взять на вооружение те разработчики ПО, которые этим занимаются серьёзно. По крайней мере, это касается 2-го и 3-го уровней CMM, так как применение этих практик дает существенное повышение в производительности и устойчивости процесса разработки ПО.

Билл Куртис , Владимир Рябикин , Марк Паулк , Мерилин Буш , Мэри Бет Хриссис , Сьюзен М. Гарсия , Чарльз В Вебер , Чарльз В. Вебер

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