Как улучшить локальные переменные в FASM?

Тема в разделе "WASM.ASSEMBLER", создана пользователем AsmGuru62, 26 июл 2009.

  1. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Локальные переменные в FASM можно сделать только внутри процедуры, объявленной через proc.
    А сама proc сделана по старому принципу:
    Код (Text):
    1. push ebp
    2. mov ebp, esp
    3. ...
    4. leave
    5. ret
    А мне надо по новому принципу:
    Код (Text):
    1. MyProc:
    2. sub esp, <size of locals>
    3. ...
    4. add esp, <size of locals>
    5. ret
    До сих пор обходился через virtual (перед каждой процедурой):
    Код (Text):
    1. virtual at 0
    2. loc1:
    3. .member1 dd ?
    4. .member2 dd ?
    5. .member3 dd ?
    6. .size = $
    7. end virtual
    8.  
    9. proc1:
    10. sub esp, loc1.size
    11. ...
    12. lea edi, [esp + loc1.member3]
    13. ...
    14. add esp, loc1.size
    15. ret
    Для других процедур, просто меняю индекс в имени: loc2, loc3, loc4, ... и т.п.
    Даже в IDE, которым пользуюсь сейчас сделал поддержку для этого, если редактор "увидит" "loc1." - то появится список полей.
    Есть какие-то идеи это улучшить? Какие-то наработки? Макросы?..
     
  2. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    А можно проще:

    Код (Text):
    1. locals
    2.    label loc1
    3. .member1 dd ?
    4. .member2 dd ?
    5. .member3 dd ?
    6. .size = $ - label
    7. endl
     
  3. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    А можно так:
    Код (Text):
    1. macro loc [names]
    2. {
    3. common
    4. if ~defined n
    5. n=0
    6. else
    7. n=n+1
    8. end if
    9. virtual at esp
    10. .loc#n:
    11. reverse
    12. .loc#n.#name     dd ?
    13. common
    14. .loc.size = $-loc#n
    15. end virtual
    16. sub esp, .loc#n.size
    17. }
    proc_name:
    loc n1, n2, n3
    lea eax, .loc.n1
    add esp, .loc.size
    ret