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