Локальные переменные в FASM можно сделать только внутри процедуры, объявленной через proc. А сама proc сделана по старому принципу: Код (Text): push ebp mov ebp, esp ... leave ret А мне надо по новому принципу: Код (Text): MyProc: sub esp, <size of locals> ... add esp, <size of locals> ret До сих пор обходился через virtual (перед каждой процедурой): Код (Text): virtual at 0 loc1: .member1 dd ? .member2 dd ? .member3 dd ? .size = $ end virtual proc1: sub esp, loc1.size ... lea edi, [esp + loc1.member3] ... add esp, loc1.size ret Для других процедур, просто меняю индекс в имени: loc2, loc3, loc4, ... и т.п. Даже в IDE, которым пользуюсь сейчас сделал поддержку для этого, если редактор "увидит" "loc1." - то появится список полей. Есть какие-то идеи это улучшить? Какие-то наработки? Макросы?..
А можно проще: Код (Text): locals label loc1 .member1 dd ? .member2 dd ? .member3 dd ? .size = $ - label endl
А можно так: Код (Text): macro loc [names] { common if ~defined n n=0 else n=n+1 end if virtual at esp .loc#n: reverse .loc#n.#name dd ? common .loc.size = $-loc#n end virtual sub esp, .loc#n.size } proc_name: loc n1, n2, n3 lea eax, .loc.n1 add esp, .loc.size ret