macro ccall proc,[arg] ; call CDECL procedure { common local size size = 0 reverse pushd arg size = size+4 common call proc add esp,size } macro proc [params] ; define CDECL procedure { common local args,size,current match name arg, params \{ if used name name: virtual at ebp+8 match =,args, arg \\{ defargs@proc args \\} match =all@args, all@args \{ defargs@proc arg \\} args = $ - (ebp+8) end virtual \} match =all@args, all@args \{ if used params params: args = 0 all@args equ \} all@vars equ current = 0 if args | size push ebp mov ebp,esp if size sub esp,size end if end if
хочу переписать все эти макросы на чистый асм... Помогите ето сделать=) Весь код не уместился, поэтому написал тольео два макроса потом дополню...
Добавлено (11.10.2009, 18:59) --------------------------------------------- Вот дальше код...
Code
macro locals
\{ virtual at ebp-size+current
macro label . \\{ deflocal@proc .,: \\}
struc db val \\{ deflocal@proc .,db val \\}
struc dw val \\{ deflocal@proc .,dw val \\}
struc dp val \\{ deflocal@proc .,dp val \\}
struc dd val \\{ deflocal@proc .,dd val \\}
struc dt val \\{ deflocal@proc .,dt val \\}
struc dq val \\{ deflocal@proc .,dq val \\} \}
macro endl
\{ purge label
restruc db,dw,dp,dd,dt,dq
restruc byte,word,dword,pword,tword,qword
current = $-(ebp-size)
end virtual \}
macro local [var]
\{ \common locals
\forward match varname:vartype,var \\{ varname vartype \\}
на примере ExitProcess, HWND_DESKTOP, text, title, 0
1: invoke - это альтернатива call, он провереряет сколькопараметров надо вытолкнуть в stack например call ExitProcess - выдаст ошибку, т.к. при таком вызове надо вытолкнуть в stack двойное слово (д.б. передоваемый параметр) (прототип ExitProcess: ExitProcess proto uExitCode:DWORD т.е. ей надо передать uExitCode:DWORD - двойное слово) invoke ExitProcess - такой ошибки не выдаст это всё макросы а не фичи ассемблянта
2: cdecl.inc здесь определены макросы: -cproc -enterc -retc -ccall -cinvoke в принципе то же самое что и stdcall - только передача параметров идёт по C-договорённости параметры передаются справа налево (т.е. самый правый параметр кладётся в стек первым), вызывающий должен уровнять стек после вызова.
К примеру без макроса invoke
push 0 push title push text push HWND_DESKTOP call [MessageBox]