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

 WASM Phorum —› WASM.ASSEMBLER —› Макросы в fasm.

. 1 . 2 . >>

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


Дата: Апр 8, 2004 02:59:23 · Поправил: Asterix

Как можно в fasm реализовать такой макрос
WM_CASE MACRO reg:REQ, msgs:REQ
 IRP msg, <msgs>
      cmp reg, WM_&msg
      je @&msg
 ENDM
ENDM



Мне показалось что вроде элементарно и я написал так:

macro WM_CASE reg, msg
 { forward
    cmp reg, WM_#msg
    je @#msg }

fasm почему-то ругается на мой макрос??


Дата: Апр 8, 2004 04:56:51

macro case var,[const]
{
forward
cmp var,WM_#const
je .wm#const
common
};case
использование
case [wmsg],COMMAND,CREATE,DESTROY
Только метки будут .wmCOMMAND .wmCREATE .wmDESTROY
Если вы привыкли к меткам другого видаможно изменить то что находится слева от знака "#"
Не подскажите, что значит символ "@"?


Дата: Апр 8, 2004 05:08:02

pas

У меня появились вопросы:
Зачем скобочки у const - [const], что они означают(догадываюсь что но не уверен)?
Зачем common?


Дата: Апр 8, 2004 05:17:11

Что-то у меня всё-равно не работает твой макрос :-(


Дата: Апр 8, 2004 10:10:52

2Asterix: почитай тут на форуме статью о макросах, там вроде есть про это.

Ну а своими словами:

1) объявим макрос так
macro push var
{
push var
}

теперь вызовем его:
push var ; никакой разницы со стандартной инструкцией
push var1, var2, var3 ; так бы конечно хотелось, но нельзя

2) объявим макрос так
macro push [var]
{
forward
push var
}

теперь вызовем его:
push var ; никакой разницы со стандартной инструкцией
push var1, var2, var3 ; а вот теперь эта фигня работает

Ну а теперь о наших баранах:)
По умолчанию даже если не указанно ничего макрос считает примерно следующее:
macro .....
{
common
....
}
поэтому весь макрос разбит на секции, у тебя как минимум одна секция common, может быть больше, например:
macro ....
{
forward
....
common
....
reverse
....
}
тут определенно три секции. Вообще секций может быть одна или более.

Теперь что они значат
common - эта секция будет выполнена только один раз, обычно в ней переменные определённые так [var] не используются, а если уж и и спользуются то эта секция будет выполненна только для первой такой переменной из всего списка (в нашем примере секция коммон будет выполненна только для переменной var1, две другие будут проигнорированны)
forward - эта секция будет выполненна для всех таких переменных причем в том порядке в котором ты их помещаешь: тоесть сначала для var, потом var2 и тд
reverse - аналогично предыдущей, только в обратном порядке: var3, var2, var1.


Дата: Апр 8, 2004 10:23:27

macro WM_CASE reg, [msg]
{
forward
cmp reg, WM_#msg
je .#msg
}

только reg - должен быть регистр, если это переменная, то или переделывать макрос или делать его более универсальным.


Дата: Апр 8, 2004 12:56:30 · Поправил: S_T_A_S_

Зачем скобочки у const - [const]

Это значит, что аргументов может быть неограниченное кол-во.
forward обрабатывает каждый из них по отдельности.


Зачем common?

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


Что-то у меня всё-равно не работает твой макрос :-(

Если не определены WM_COMMAND,WM_CREATE,WM_DESTROY, метки .wmCOMMAND .wmCREATE .wmDESTROY и [wmsg] - то так и будет
Наверное у тебя uMsg какойнибудь



push var1, var2, var3 ; так бы конечно хотелось, но нельзя

Зато можно так (стандартная команда)
push var1 var2 var3


Дата: Апр 8, 2004 16:26:27

S_T_A_S_

Я хочу впереди метки иметь @, разве есть какие-то проблемы с этим символом?

Ладно, разве никто не заметил что первоначально написанный мной макрос не отличается от предложенных всеми вами, разве что я скобочки [] не поставил..
Но, не работают они, ни один из предложенных вариантов, вот.
В чём засада?


Дата: Апр 8, 2004 16:31:19

S_T_A_S_

Подожди, сейчас только заметил, что значит не определены, fasm не знает чему соответствуют WM_INITDIALOG, WM_COMMAND, WM_CLOSE ?


Дата: Апр 8, 2004 17:17:38 · Поправил: S_T_A_S_

Asterix

хочу впереди метки иметь @, разве есть какие-то проблемы с этим символом?
FASM использует локальные метки, начинающиеся с точки - а с @ будут глобальные метки.


Но, не работают они, ни один из предложенных вариантов, вот.
У меня работает


fasm не знает чему соответствуют WM_INITDIALOG, WM_COMMAND, WM_CLOSE ?
Если не подключить инклуды - нет :)

Наиболее вероятна проблеме с .wmCOMMAND .wmCREATE .wmDESTROY и [wmsg]


Дата: Апр 8, 2004 17:45:13

common в конце макроса я поставил, потому, что как то писал макрос (не помню какой) без указания в конце макроса common он не работал. Макрос я провери прежде чем отправлять. Что конкретно сообщает FASM?


Дата: Апр 8, 2004 17:55:32

Asterix
Я хочу впереди метки иметь @, разве есть какие-то проблемы с этим символом?
Проблем нет, есть нюанс - если у тебя две или более оконных процедур, то наверняка в каждой буду определены свои @WM_DESTROY и тд - а это уже проблема.


Дата: Апр 8, 2004 18:06:41

[ pas - что как то писал макрос (не помню какой) без указания в конце макроса common он не работал. ]

Наверное такой:
(тоже будет и с virtual/end virtual)
macro  foo {
forward  if
common   end if }


Скобочка } обрабатывается не зависимо ни от каких условий внутри макроса, это можно использовать, например так:
macro	proc	name, [arg]	;;  declare proc.
 {	if	~ used name
..........
 }

macro	endp			;;  end of proc body
 {	
..........
	end if	 }

То что между proc/endp будет ассемблироваться только если где-то есть вазов name


Дата: Апр 8, 2004 18:19:52

Короче я уже замучался, вот исходник, работать конечно он не будет(я его покрамсал) но компилиться должен.

242787492__Dlg.rar


Дата: Апр 8, 2004 18:56:30

include macros.inc
error: invalid argument.

Правильно: include 'macros.inc'
И все компилируется (FASM 1.52)

. 1 . 2 . >>


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