· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Условная компиляция в masm.

Посл.отвђт Сообщенiе


Дата: Июл 19, 2004 16:34:30

Сабж собственно имеет место быть, если да то где можно почитать
об этом ?


Дата: Июл 19, 2004 16:39:38


Дата: Июл 19, 2004 16:48:40

Нашел немножко здесь http://www.wasm.ru/article.php?article=macrocmd
но хотелось бы побольше примеров.

intuit
Спасибо, я посмотрю, что-то мне эта страничка напоминает, уж не Юров ли.


Дата: Июл 19, 2004 18:14:20 · Поправил: Asterix

intuit
Там tasm в общем-то, жалко :-(
Хотя многое совпадает и то что мне было нужно я нашёл :-)
Забыл, есть ведь help к masm32..


Дата: Июл 19, 2004 18:28:02

Кстати, S_T_A_S_, а что там по поводу условной компиляции в FASM ?


Дата: Июл 19, 2004 21:31:57 · Поправил: S_T_A_S_

Asterix

Это конечно не совсем относится к первоначальной теме про MASM :)

В FASM условная компиляция присутствует.
Например, когда используешь макрос proc, ф-ция будет включена в экзешник, только если где-то есть её вызов (call / invoke)
Если же она не используется, то откомпилирована не будет, это очень удобно.

С примерами туго :(
Официальный Programmer's Manual - там раздел на один экран. (2.2.2 Conditional assembly)
Кое-что есть в "FASM Preprocessor Tutorial by vid", 7. Условный препроцессинг.

Основная проблема с которой можно столкнуться при переходе с MASM - в FASM IF/ELSE IF/END IF относятся именно к компилятору (ассемблеру) (в MASM по-видимому к препроцессору).
Т.е. работает для условной компиляции мнемоник и всяких db/dd

Поэтому IF'ы не влияют на выполнение таких директив препроцессора как EQU и FIX или определения макросов и структур.

Код

if 0
foo equ 0
end if

будет всё равно задавать foo значение 0.

Для того, что бы это обойти, Privalov написАл специальный макрос:
macro	define	name { name fix defined }; TO DO

macro	ifdef	name, condmacro, elsemacro
{
	macro	ifdef#name	_% elsemacro %_
	macro	ifdef#defined	_% condmacro %_
	ifdef#name
	purge	ifdef#defined, ifdef#name
}

Т.е. если где-то указать:

define yes

то при обработке

ifdef yes, first, second

будет выполнен макрос first, если не указывать define, то second


Если нужен какой-то конкретный пример, напиши, попробую придумать.


Дата: Июл 19, 2004 22:30:45

меня вот что интересует, в masm как оказалось я могу сделать следующее:
определить константу, например,
DEBUG  equ  1

а в коде написать следующее
IF DEBUG
  invoke MessageBox, .., .., .., ..
ENDIF


Т.е. если DEBUG == TRUE, то код с MsgBox попадёт в программу.
Есть то же самое в FASM ?


Дата: Июл 19, 2004 22:54:24

Уже проверил, это работает и в fasm :)
DEBUG = 1


if DEBUG
xor eax, eax
end if


Дата: Июл 20, 2004 04:27:47

S_T_A_S_
В качестве параметров condmacro и elsemacro передаются названия макросов с параметрами?


Дата: Июл 20, 2004 07:33:35

У меня как-то был набор ASSERT-ов для TASM32 сделанный через условную компиляцию - как в "C".
Или вот ещё неплохое макро для единого исходного кода (UNICODE/ANSI):
UnicodeApi macro api
  IFDEF UNICODE
    api TextEqu <api&W>
    extern api&W : proc
  ELSE
    api TextEqu <api&A>
    extern api&A : proc
  ENDIF
endm

UnicodeApi CreateWindowEx
UnicodeApi GetWindowLong
UnicodeApi ...

...
call api, ...
...


Дата: Июл 20, 2004 14:07:27

pas

Можно и с параметрами, но тода нужно так:

ifdef yes, <first 0,1,2,3,4,5>, <second 6,7,8>


Дата: Июл 20, 2004 18:20:19

S_T_A_S_
Спасибо.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.073