Работа со структурами данных в масм.

Тема в разделе "WASM.BEGINNERS", создана пользователем OFFSIDE, 15 фев 2008.

  1. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    Код (Text):
    1. FirstTable struct
    2.     DATETIME db 17  ?
    3.     SEIZE   dd  ?
    4.     TRAFFIC dd  ?
    5.     CONGEST dd  ?
    6.     INSTALL dd  ?
    7.     AVAIL   dd  ?
    8.     ENDCHN  dd  ?
    9. FirstTable ends
    10. .code
    11. Events_proc proc wParam:WPARAM,lParam:LPARAM
    12. LOCAL FT    [24]: FirstTable
    Как обратиться к 4-ой копии FT.DATETIME? Есть в масме прямой вызов?
     
  2. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    mov eax, FT[4-1].StructMember; например.
     
  3. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    KeSqueer
    Не работает;( В квадратных скобках будет смещение относительно указателя на массив структур FT. Т.е. FT[4-1].StructMember - указатель на StructMember, плюс смещение 3 байта.

    Думаю надо определять размер структуры и обращаться напрямую(.
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Нету. Высчитывай смещение сам.
     
  5. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    OFFSIDE
    Как обратиться к 4-ой копии FT.TRAFFIC?
    Код (Text):
    1. FirstTable struc
    2.     DATETIME db 17 dup (?)
    3.     SEIZE   dd  ?
    4.     TRAFFIC dd  ?
    5.     CONGEST dd  ?
    6.     INSTALL dd  ?
    7.     AVAIL   dd  ?
    8.     ENDCHN  dd  ?
    9. FirstTable ends
    10. .data
    11. FT FirstTable 10 dup(<>)
    12. .code
    13.              mov edi,offset FT
    14.     assume edi:ptr FirstTable
    15.     mov eax,[edi].TRAFFIC + sizeof(FirstTable)*(4 - 1)
     
  6. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    может type? size = type * length, т.е. размер всего массива должно вернутся afair
     
  7. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    Я лично сделал вот так
    mov ebx,type FT
    mov esi,offset FT.DATETIME
    а потом уже добавляешь к esi стока раз ebx сколько надо чтоб попасть на нужную структуру
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    В данном случае sizeof(тип), поэтому он равен type(тип).
     
  9. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    неудобно:dntknw: Обращение к элементу структуры очень расплывчато...
    Код (Text):
    1. lea eax,FT[(3-1)*size FT].DATETIME;
    Можно ли написать какой нить макрос?
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    OFFSIDE
    Если неудобно, возьми си. А вообще, структуры часто располагаются не по фиксированному адресу и тогда вычислять адрес элемента ещё "неудобнее".