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

 WASM Phorum —› WASM.PROJECTS —› FASM macro library

<< . 1 . 2 . 3 . 4 . 5 . >>

Посл.отвђт Сообщен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

Добавлено пара примеров.
Так же появилась некоторая документация (правда пока на моём корявом английском, если кому нужно по-русски - пишите здесь, т.к. пока кажется это не нужно никому кроме меня :)

Новое в версии:

  • CDECL функции
  • макросы для создания простых меню (с автоматическим созданием акселераторов и обработчика)
  • шаблонные функции для работы с простыми окошками


Т.к. добавлены некоторые константы к стандартным 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 качать..

<< . 1 . 2 . 3 . 4 . 5 . >>


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