|
|
| Посл.отвђт | Сообщен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) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.084 |