|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июл 24, 2004 07:52:48 S_T_A_S_ А вобще препроцессор умеет распозновать длину параметра? |
|
|
Дата: Июл 24, 2004 10:54:59 Если я не ошибаюсь, FASM хранит все константы в формате signed 64bit. Потом уже в зависимости от контекста использует какую-то часть. Вот, попробуй такой макрос, вроде бы должен работать. U64 equ
macro pushd arg
{ if _#arg eq _U64 arg
local low, hi
virtual at 0
dq arg
load low dword from 0
load hi dword from 4
end virtual
push hi
push low
else
pushd arg
end if }
Используй: invoke someproc,U64 012345678ABCDEFh,0 |
|
|
Дата: Июл 25, 2004 23:05:01 S_T_A_S_ Круто! Спасибо, рулезный макрос. OpenGL здесь не при чем =) |
|
|
Дата: Авг 3, 2004 20:28:37 Добавлено пара примеров. Так же появилась некоторая документация (правда пока на моём корявом английском, если кому нужно по-русски - пишите здесь, т.к. пока кажется это не нужно никому кроме меня :) Новое в версии:
Т.к. добавлены некоторые константы к стандартным fasm'овским инклудам, они так же включены в архив, поэтому размер увеличился несколько сильнее, чем следовало бы ожидать. _1343184811__ag.part1.rar |
|
|
Дата: Авг 3, 2004 20:29:01 |
|
|
Дата: Авг 5, 2004 18:22:17 Давно (неделю или две?) сюда не заходил. Макрос U64 - просто супер! На сколько просто - на столько же эффективно. Я вот не додумался :( Ну а чего значит зашел, так просто новости опубликовать. Разработка вложенных процедур идет. В качестве основы используется enter x,y. Как только появится первая юзабельная версия - сразу выложу. К сожалению можете быстро ее не ожидать (кто будет ожидать, хе-хе), за неимением достаточного обьема свободного времени. Все, всем спасибо и извините за неинформативность. |
|
|
Дата: Авг 5, 2004 23:45:59 S_T_A_S_ Твой пример что в этой версии макросов cpu_freq перестал работать в win98, хотя раньше вроде работал. |
|
|
Дата: Авг 6, 2004 07:50:24 Мне вот интересно, почему у fasm какая-то проблема со знаками равенства < > != == , судя по всему их можно использовать исключительно внутри макросов, а было бы не плохо написать наконец нормальные макросы .IF/.ENDIF, в которых можно было бы писать код в синтаксиса masm'а. |
|
|
Дата: Авг 6, 2004 08:11:04 · Поправил: S_T_A_S_ Asterix > Твой пример что в этой версии макросов cpu_freq перестал работать в win98, хотя раньше вроде работал. Да, есть такое..Экзешник откомпилирован как unicode, соответственно MessageBoxW и wsprintfW не работают. Можно убрать из исходника строку UNICODE и перекомпилировать. > было бы не плохо написать наконец нормальные макросы .IF/.ENDIF, в которых можно было бы писать код в синтаксиса masm'а. Думаешь стОит? Теоретически наверное можно сделать. тока мне что-то все эти if/else не нравятся уж больно - код зачастую неоптимальный у них получается, ручками гораздо лучше.. |
|
|
Дата: Авг 6, 2004 15:08:37 S_T_A_S_ > Экзешник откомпилирован как unicode, соответственно MessageBoxW и wsprintfW не работают Что-то тут не то, вот посмотри аттач, exe'шник с MessageBoxW, работает однако в win98. > Думаешь стОит? Теоретически наверное можно сделать. Думаю да, если можно рассчитывать на макрос вида .IF eax<=25 && edx<3 ...... .ENDIF без каких-либо скобочек между знаками, но проще конечно реализовать .IF eax ..... .ENDIF или .IF !(eax) ..... .ENDIF 1376400771__test.exe |
|
|
Дата: Авг 6, 2004 17:15:30 · Поправил: S_T_A_S_ Дык и у меня MessageBoxW работает - заголовок-то показывается, wsprintfW всё мутит. > Думаю да, если можно рассчитывать на макрос вида .IF eax<=25 && edx<3 Именно такого вида не знаю как cделать :( Можно попробовать что-то вроде .IF eax,<=,25, &&, edx,<,3 Но imho это как-то выгдядит не очень дзенно. .IF и .IF! у меня кстати уже реализованы, причём аргументом может быть регистр, ячейка памяти или функция. Может быть сделать какие нибудь .IFBE eax,25 ? Вот мне варианты когда много аргументов макрос имеет не нравятся, т.к. в этих случаях генерируется иногда 2 Jcc, что imho плохо.. Да и случаи когда нужно проверять сразу 2 регистра обычно можно упростить. Я думаю сделать макрос для множественных проверок вроде: 2<eax<5 || 22<eax<25 || 52<eax<55 Это всё можно делаеть серией команд LEA с одним Jcc. Ещё можно будет написАть макрос для проверки подобных выражений путём использования битовой маски - путём RLC & Jcc. Пока мне не совсем ясно, как это всё должно выглядеть синтаксически, что бы можно было бы скормить препроцессору FASM. PS Кстати, если кому кажется, что макросы из аттача компилируются слиииишкоооом доооолгооо, то быстрое лекарство - найти (direct.fi) и удалить ОПРЕДЕЛЕНИЕ макроса BUG. В последующих версиях со скоростью должно быть лучше, пока на это внимания мало обращал. |
|
|
Дата: Авг 6, 2004 18:23:22 > найти (direct.fi) и удалить ОПРЕДЕЛЕНИЕ макроса BUG Вот так всегда, нужно только от BUG'ов избавиться и всё пойдет как по маслу ;-) > .IF eax,<=,25, &&, edx,<,3 Но imho это как-то выгдядит не очень дзенно. Напиши для начала просто такой .IF eax,<=,25 я хочу понять как его можно сделать ;-) потом уйдёшь от запятых как ушёл при invoke :-) > Может быть сделать какие нибудь .IFBE eax,25 ? Это мне не нравится, уже есть подобные макросы у Privalov'а, это какой-то изврат, лучше бы он препроцессор доделал чтоб наконец-то подогнать синтаксис под нормальный HLL masm'а, иначе это получается что нужно выучить дополнительные чуждые команды типа .IFBE |
|
|
Дата: Авг 7, 2004 15:07:49 Вот, для пробы накидал макрос
macro _IF arg,condition,arg2
{
local ..endif
..ENDIF.. equ ..endif
cmp arg,arg2
if 0 condition 1
if 0 condition 0 ; < <=
ja ..endif ; <=
else
jae ..endif ; <
end if
else if 1 condition 0
if 0 condition 0 ; > >=
jb ..endif ; >=
else
jbe ..endif ; >
end if
else if 0 condition 0
jne ..endif ; =
else
je ..endif ; <>
end if
}
Используется так (.ENDIF из аттача): _IF eax,>=,1 MessageBox 0,@T 'Ok',@T 'Ok',0 .ENDIF Но сразу проблемы появились от которых никак не уйти. Работают только символы ">" ">=" и "=". Если есть символ "<", то FASM думает что это скобочка для множественных аргументов (вроде <0,1,2>) и соответственно ругается, т.к. закрывающей скобочки нет. В общем, получается, что можно только половину сравнений реализовать таким образом (ну не писАть же символы прям в кавычках =)). Вариант _IF! eax,>,5 вместо _IF eax,<=,5 imho как-то заумно выглядит. Если же делать _IF 5,>=,eax то макрос усложнится, к тому же это не для всех случаев подойдёт.. > потом уйдёшь от запятых как ушёл при invoke :-) В данном случае без запятых видимо не получится, т.к. в случае с invoke я для вызова каждой функции отдельный макрос использую (одноимённый с ней), а символы <>= даже директивой FIX не переопределяются, т.к. являются служебными.. > Вот так всегда, нужно только от BUG'ов избавиться и всё пойдет как по маслу ;-) :-) На самом деле это макрос достаточно громоздкий, он вызывает другоё DISPLAY, тот ещё.. и так для каждой испортируемой функции по нескольку раз. Большенство из них можно заменить на оригинальный display так будет заметно быстрее, я позже так и сделаю, сейчас пока для отладки так удобнее. |
|
|
Дата: Авг 7, 2004 20:22:14 S_T_A_S_ > ну не писАть же символы прям в кавычках =)). Мысль, я когда-то пытался но не понял как это осуществить eax,'<=',-1 А почему твой макрос _IF, _ вместо . чтоб не конфликтовать с ранее тобой написанными или с Приваловскими? |
|
|
Дата: Авг 8, 2004 02:06:10 · Поправил: Asterix S_T_A_S_ Я тут попробовал вот это _IF eax,'<=',-1 довольно неплохо получается, можно использовать любые символы, как то == < > != <= >= и даже подсветка им не нужна, т.к. заключенные в кавычки '' они и так подсвечиваются, даже в родном IDE fasm'а :-) Зы: правда у меня начались проблемы с инклудами после того как я поменял их часть на те что выкладывал Privalov в ветке про расширенные макросы, скорее из-за того что он изменил макрос stdcall, придётся наверно версию 1.54 качать.. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.098 |