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

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

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

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


Дата: Авг 19, 2004 19:23:38

S_T_A_S_
вот простейший пример
include 'ext.fi'

!GUI

PROC p1
	MessageBox	0, @T "hello", @T "hello", 0
	RET
ENDP

entry $

	p1
	ExitProcess	0

!END


без "mov fix MOV" все удачно.
как только ставлю его (а ставлю именно после макроса MOV) , то получаю следующее:
*****   Assembling:
  Format  PE GUI 4.0 at 400000h
     PROC "p1" not used nor included.

main.asm [8]:
ENDP
C:\fasm\INCLUDE\#Inc/fun.fi [575] ENDP [16]:
end if
error: unexpected instruction.
в 575й строке fun.fi находится "end if". Кусок его я выше кидал.


Дата: Авг 20, 2004 00:03:50 · Поправил: S_T_A_S_

Гм.. Я щас попробовал всё это откомпилить - Ok.

Более того, у меня компилируется и это:
include 'ext.fi'

!GUI

PROC p1
	MessageBox	0, @T "hello", @T "hello", 0
	RET
ENDP

entry $

	p1
	mov eax,<ExitProcess	0>

!END


Вот что мне кажется странным: „в 575й строке fun.fi“

В новой версии fun.fi всего 556 строк!
То есть туда добавлено что-то ещё, кроме "mov fix MOV"?


PS
Ещё можно попробовать RET заменить на ret


Дата: Авг 20, 2004 06:17:07

Блин, ну мы (я) же говорим в первую очередь об замене стандартного mov на оптимизирующий, т.е. в fun.fi вот это есть:
macro MOV arg1,arg2
{
   if arg1 in <eax,ebx,ecx,edx,esi,edi,ebp,esp>
      if arg2 eqtype 0
         if arg2 = 0
            xor arg1,arg1
         else if arg2 = 1
            xor arg1,arg1
            inc arg1
         else if arg2 = -1
            or  arg1,-1
         else if arg2 >= -128 & arg2 < 128
            push arg2
            pop  arg1
         else
            mov  arg1,arg2
         end if
      else
         mov arg1,arg2
      end if
   else
      mov arg1,arg2
   end if
}


Дата: Авг 20, 2004 07:43:28

Еще в добавку, в fun.fi при учете стэка "перехватываются" команды pusha, popa, pushfd и др.
Я по привычке пользуюсь pushad/popad, которых там не оказалось почему то... добавил по аналогии с pusha/popa.


Дата: Авг 20, 2004 10:55:31

Всё, понял теперь..

Проблема здесь:

if arg2 = 0


Появляется когда происходит вызов "оптимизирующего" макроса с пустым 2м аргументом, например из RET:

mov eax,value

при "пустом" value получаем:

if = 0

Это FASM НЕ воспринимает как if и.. end if вызывает ошибку.

Решается так:

if arg2+0 = 0


> „Еще в добавку, в fun.fi при учете стэка "перехватываются" команды pusha, popa, pushfd и др.
Я по привычке пользуюсь pushad/popad, которых там не оказалось почему то... добавил по аналогии с pusha/popa.“


Да, верно, я просто забыл про них, так как по привычке пользуюсь pusha / popa :)
pushad/popad вроде бы как даже правильнее использовать, хотя это только рекомендация intel.


Дата: Авг 20, 2004 21:22:01

угу. помогло. на частично. вылечили голову - заболел живот :))
metka:
db 1,2,3,4

mov eax,metka

получаем ругань вида
filename.asm [22]:
mov eax,metka
C:\fasm\#Inc/fun.fi [164] MOV [5]:
if arg2+0 = 0
error: invalid use of symbol.

можно конечно тут lea заюзать, но факт в том что так оно работало...


Дата: Авг 20, 2004 22:11:50 · Поправил: S_T_A_S_

Дык живот-то и без головы болел ;-)
Это изначальноая проблема самого макроса:
==============================================
format  PE; если эту строку убрать, то работает

macro mov arg1,arg2
{
   if arg1 in <eax,ebx,ecx,edx,esi,edi,ebp,esp>
      if arg2 eqtype 0
         if arg2 = 0
            xor arg1,arg1
         else if arg2 = 1
            xor arg1,arg1
            inc arg1
         else if arg2 = -1
            or  arg1,-1
         else if arg2 >= -128 & arg2 < 128
            push arg2
            pop  arg1
         else
            mov  arg1,arg2
         end if
      else
         mov arg1,arg2
      end if
   else
      mov arg1,arg2
   end if
}

metka:
db 1,2,3,4

mov eax,metka
==============================================


Вот исправленный вариант:
macro mov arg1,arg2
{
   if arg1 in <eax,ebx,ecx,edx,esi,edi,ebp,esp>
      if arg2 eqtype 0

         local  arg
         virtual
                dd arg2
                load    arg   dword from $-4
         end virtual

         if arg = 0
            xor arg1,arg1
         else if arg = 1
            xor arg1,arg1
            inc arg1
         else if arg = 0FFFFFFFFh
            or  arg1,-1
         else if arg >= 0FFFFFF80h | arg < 80h
            push arg
            pop  arg1
         else
            mov  arg1,arg2
         end if
      else
         mov arg1,arg2
      end if
   else
      mov arg1,arg2
   end if
}


Дата: Авг 21, 2004 06:10:19

Ок. сенк! все пашет :)
Предлагаю на рассмотрение вот такие 2 макроса:
macro debug_print pString
{
	if DEBUG = 1
		pushad
		OutputDebugString pString
		popad
	end if
}

macro debug_printf aFmt, [arg_i]
{
	common 
	if DEBUG = 1
			__DP_N_ARGS = 0
			pushad
			sub esp,0x200
		reverse 
			push arg_i
			__DP_N_ARGS = __DP_N_ARGS + 1
		common 
			PUSH aFmt
			lea eax,[esp+(__DP_N_ARGS*4+4)]
			push eax
			CALL wsprintf
			CALL OutputDebugString
			add esp,0x200 + (__DP_N_ARGS*4 + 4)
			popad
	end if
}


вызывать например так:
debug_print @T "we're in!"
debug_printf @t "ecx=%08x, buf=%08x, text='%s'",ecx,[pbuf],LEDX aSomeString

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


Дата: Авг 21, 2004 07:08:25 · Поправил: S_T_A_S_

Ещё можно к нему прикрутить проверку на соответствие количества аргументов символам "%" и обработку "\n"
как я это сделал здесь.


Так же в аттаче некоторая попытка упростить отладку (thanks to Foamplast за идею)
В макрос PROC нужно добавить одну строчку, а в основной файл ещё несколько (см. test2.fat)
Результаты смотреть в Olly
macro	PROC	name,[arg]
{	
	common	__PROC_args__	fix RETADDR,arg
	
__DEBUG_INFO__	fix __DEBUG_INFO__,name,`name   ; <-добавить 
	
macro	PROC [dummy]	_%	end if


Пока решение сыроватое, позже думаю улучшить, щас время мало - пытаюсь прикрутьть PDB файлы..

1601558909__test2.zip

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


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