столкнулся с такой проблемой, нужно написать функцию, котрая в качестве аргумента принимает саму структуру, а не указатель на нее. Извлеч из стека аргументы - не проблема, хотелось бы красиво оформить макросом proc... sizeof.mystruct тоже не помогло. Но уверен выход есть. proc myproc xx:WORD, yy:mystruct ret endp
В макросе proc (а точнее, это надо в push) вряд ли можно определить, что это структура. Реализация-то простая: Код (Text): lea esi,[structvar] mov edi,esp mov ecx,sizeof.struct rep movsb invoke myproc,xx
IceStudent Кажется немножко не то... Вызывающий код затолкает мне 15 DWORD в стек (WSPUPCALLTABLE). я их могу брать lea eax, [structvar] [eax+2] [eax+4] [eax+6] вопрос в том как оформить шапку proc и чтобы ret endp мне стек выравнял.
assorted А, тебе только доставать.. Можно что-нибудь придумать, спроси на форуме фасма, там есть фанаты macro-art'a. В конце концов, локальные переменные могут быть и структурами, значит, можно добавить и в параметры функций. А если просто, чтобы заработало - объяви фейковые аргументы, чтобы автоматом стек выравнивался. Например, 6 tbyte'ов, а за ними lpProcTable.
Проверить возможности нет, но можно поправить макросы определяющие структуру и процедуру 1) В макросе создавать константу типа name.struc=true 2) В макросе процедуры проверять значение константы name.struc и если она true, то сливать в стек структуру целиком.
pas Это первое, что приходит в голову. Я так делал перегрузку и вызов локальных функций через invoke. Просто думаю, что могут быть более элегантные решения.
первое что прешло в голову Код (Text): FORMAT PE GUI 4.0 at 500000h entry EntryPoint include '%fasminc%\win32a.inc' section '.main' code readable writable executable macro xproc name,[arg] ;макро определенийа процедуры { common name: virtual at ebp+8 if ~ arg eq forward match names-ty, arg \{ names ty \} common end if ..ret = $ - (ebp+8) end virtual local ..dynamic_data,..dynamic_size dynamic_data equ ..dynamic_data dynamic_size equ ..dynamic_size virtual at ebp - dynamic_size dynamic_data: } macro enter ;макро начала кода в процедуре { rb (2 - ($-dynamic_data) and 1b) and 1b dynamic_size = $ - dynamic_data end virtual push ebp mov ebp,esp sub esp,dynamic_size} macro return ;макро возврата { leave ret ..ret } macro xstdcall proc,[arg] ;макро вызова { reverse match name-ty, arg \{ local ..size1 local ..size2 virtual at esi ..size1 ty ..size2 = $-..size1 end virtual sub esp,..size2 pusha lea edi,[esp+20h] lea esi,[name] mov ecx,..size2 rep movsb popa \} common call proc } ; ;Описание тестовых структур ; struct TEST1 t1 dd ? t2 dd ? ends struct TEST2 t TEST1 t1 dd ? t2 dd ? ends ; ;Структуры ; s1 TEST1 s2 TEST2 proc EntryPoint ; ;тестовые значенийа ; push 1 push 2 pop [s1.t2] pop [s2.t1] ; ;Вызов процы ; xstdcall testeng,s1-TEST1,s2-TEST2 jmp $ endp ; ;Проца ; xproc testeng,par1-TEST1,par2-TEST2 lll dd ?;здесь объявляем локальные переменные enter ; ;Попробуем извлечь значенийа из струтуры ; mov eax,[par1.t2] mov edx,[par2.t1] ; ;Выход ; return