fasm.Работа со структурами через регистры.

Тема в разделе "WASM.BEGINNERS", создана пользователем aleksander, 25 апр 2007.

  1. aleksander

    aleksander New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2007
    Сообщения:
    1
    Может я изобрел велосипед, но очень хотелось обращаться к полям структуры, сразу после получения памяти на нее. Для этого сделал такой финт:
    Код (Text):
    1. macro field fName, fSize
    2. {
    3. fSize 0
    4. fName = $ - @B - 4
    5. }
    Сама структура описывается так:
    Код (Text):
    1. @@:
    2. field someStruct.a, dd
    3. field someStruct.b, dd
    4. field someStruct.c, dd
    5. somStruct.size = $ - @B
    Можно было сделать макрос понавороченней, но не в этом суть.
    Работает только с двойными словами.
    И все это затевалось для того, чтобы работать так:
    Код (Text):
    1. proc CreateNewStruct
    2.   mov eax, somstruct.size
    3.   invoke LocalAlloc, LMEM_FIXED, eax
    4.   mov [eax + somStruct.a], dword 123
    5.   mov [eax + somStruct.b], dword 456
    6.   mov [eax + somStruct.c], dword 789
    7.   ret
    8. endp
    Так вот вопрос: это боян?
    Или может существует какой-то более простой способ обращаться к полям структуры непосредственно через регистр?
    Конкретно фасм изучаю недавно, поэтому можно просто привести пример, как правильно.
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Так изначально можно было писать.
    Ещё есть virtual, смотри справку.
     
  3. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Код (Text):
    1. ; Declaring structure RECT with 'virtual'
    2.  
    3. virtual at 0
    4. RECT:
    5.   .left dd ?
    6.   .top dd ?
    7.   .right dd ?
    8.   .bottom dd ?
    9.   .size = $
    10. end virtual
    11.  
    12. ...
    13.  
    14. mov ecx, RECT.size     ; Number of bytes taken by structure RECT
    15.  
    16. ...
    17.  
    18. mov ebx, <address of RECT>
    19. mov [ebx + RECT.top], 123
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Опять же - есть sizeof.RECT