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

 WASM Phorum —› WASM.ASSEMBLER —› улучшение макроса

<< . 1 . 2 . 3 .

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


Дата: Июл 22, 2004 14:50:56

S_T_A_S_
> Хотя для знатоков PERL нет сложностей перелопатить стандартные инклуды ;-)

Ну до знатока мне далеко, но например инклуды для fasm'а я сделал перегнав masm'овские скриптом на Perl :-)

Four-F
> Очень интересная ветка, но, IMHO, граничит с извратом.

Я заметил только один изврат или неудобство, нельзя переносить строку вызова функции, т.е. нельзя применять символ \


Дата: Июл 23, 2004 01:10:33

Кстати, S_T_A_S_, а зачем в этой строчке
common if _#source eq _invoke source
добавлять впереди символ подчеркивания _, разве так
common if source eq invoke source
не прокатит ??


Дата: Июл 23, 2004 09:49:13

Поскольку "invoke equ ", то второе условие будет всегда истинно.
В первом случае же к invoke "прикрепляется" символ, а "_invoke" - это уже не пустое место, а "_invoke".


Дата: Июл 23, 2004 22:40:34

S_T_A_S_
> Поскольку "invoke equ "

Что-то я опять не понял, почему invoke equ ?
Ведь приведенные выше мной строчки для макроса mov но не для макроса invoke.


Дата: Июл 23, 2004 23:15:12

Но "invoke equ " всё равно должно быть объявлено так.
Макрос MOV проверяет, является ли его аргуменотом invoke, и если да, то выполняет invoke.


Дата: Июл 24, 2004 00:15:04

> Но "invoke equ " всё равно должно быть объявлено так.

Почему?

> Макрос MOV проверяет, является ли его аргуменотом invoke, и если да, то выполняет invoke.

Это понятно, с логикой я уже разобрался, но остались нюансы ;-)


Дата: Июл 24, 2004 00:53:17

Если invoke не делать "EQU ", то после препроцессинга получим:

common if _invoke source eq _invoke invoke source
что не есть хорошо.

Смысл такой: отдельный invoke препроцессором преобразовывается в "" (т.к. есть "invoke equ "), а при добывлении символа "_" путём "_#invoke" получится "_invoke", как и в правой части условия. Таким образом определяется, что "source" содержит в начале "invoke".

В FASM нет специальных директив, как в MASM, получается, что мы как бы программируем препроцессор :)
Поэтому и то, что в MASM делается одной командой, в FASM иногда приходится делать несколькими, но гибкость выше.


Дата: Июл 24, 2004 02:08:45

S_T_A_S_
Точно!
Туплю, ты ведь мне уже подобное объяснял :-)

Видел новый макрос Privalova - invoke ??
Ну и наворотил он там, но это практически то что мне было нужно, я бы ещё предпочел вызов функции заключать в скобочки ()
Думаю ещё заюзаю расширенный mov, как у тебя в этом топике, и мне пока хватит ;-)


Дата: Июл 24, 2004 03:23:43

Да, марос хороший. Самое главное, я теперь знаю, как обеспечить рекурсивность макросов, не задавая их по 5 раз :-)
Хотя в новой версии моих макросов рекурсия уже не требуется. Только компилируется что-то не слишком бысторо =)


Дата: Авг 22, 2004 19:27:37

Four-F, странно, но если функция(и) cdecl то masm ругается на вложенные invoke, т.е. $invoke.


Дата: Авг 22, 2004 20:33:03

Надо будет репу почесать.


Дата: Авг 23, 2004 02:55:23

Four-F, зря я бил тревогу, это в портированном inc'е OllyDbg для masm была ошибка
в прототипах.
.IF $invoke(Findthread, $invoke(Plugingetvalue, VAL_MAINTHREADID)) != NULL

Findthread была объявлена как stdcall, но на самом деле она cdecl, также как и Plugingetvalue. После исправления всё нормально скомпилилось.


Дата: Авг 23, 2004 12:13:34

Asterix, спасибо, что избавил от вычёсывания остатков :)

<< . 1 . 2 . 3 .


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