Указатели на структуры masm32

Тема в разделе "WASM.BEGINNERS", создана пользователем uckuht, 11 май 2010.

  1. uckuht

    uckuht New Member

    Публикаций:
    0
    Регистрация:
    11 май 2010
    Сообщения:
    8
    Всем доброго времени суток.
    Дело вот в чем:
    есть у меня структура содержащая указатели на некоторые обьекты-буферы.
    Есть еще процедура каторая эти обьекты обрабатывает.
    В теле этой процедуры вызываются функции которым необходим доступ к каждому элементу структуры отдельно. Их работы я не знаю, но буферы динамические, и изменяются этими функциями.
    Пока обьектов было не много я вызывал свою процедуру для каждого отдельно, и это было достаточно удобно, но теперь их кольчество (обьектов) планируется около 250, и возникла необходимость создавать менеджер обработки.
    Я решил, что этот менеджер будет выбирать обьекты для обработки и сохранять их указатели(offset) в отдельный буфер после чего передавать управление процедуре-обработчику, который собственно должен извлекать эти указатели по очереди и обрабатывать обьекты пока не встретит 0-указатель, и возвращает управление в главный процесс.
    Теперь проблемма: не могу получить доступ к каждому элементу структуры отдельно. Разыменую указатель на общий буфер, после разыменовываю первый указатель на структуру. И зависаю. Через assume: представляю регистр, перехожу по элементам, сохраняю, обрабатываю, все работает, но почемуто только для первого елемента общего буфера. Остальные не хотят вылезать. Висну на втором проходе,чотко. Причом если передавать Следущий элемент общего буфера, то но обрабатывается, думаю буфер заполняется правильно.
    Вот как это примерно выглядит:
    Код (Text):
    1.     mov eax,offset pObj
    2.     mov Objects[0],eax
    3.     mov eax,offset pObj1
    4.     mov Objects[4],eax
    5.     invoke  DAll,Objects[0];
    6.  
    7. DAll proc Param:DWORD
    8. LOCAL x
    9. LOCAL y
    10. LOCAL z
    11.  
    12. mov eax,[Param]
    13. @loop:
    14. .if [eax]!=0; если написать так то будет ошибка, но так понятней.
    15.  
    16.     assume eax : ptr SOMESTRUCT
    17.     push [eax].x
    18.     push [eax].y
    19.     push [eax].z
    20.     pop z
    21.     pop y
    22.     pop x
    23.     assume ebx : nothing   
    24.  
    25. ;обработчик xyz
    26.  
    27.             assume ebx: ptr D3DOBJECT
    28.     invoke Set,[eax].pBuffer   
    29.     invoke Prime,[eax].SomeBuff,[eax].SomeBuff2
    30.     assume ebx : nothing
    31.  
    32. add eax,4
    33.  
    34. jmp @loop
    35.  
    36. .else
    37. ret
    38. .endif
    39. DAll endp
    Если элемент 1 то эта конструкция работает, если передать invoke DAll,Objects[4] то обработается именно этот элемент, но где я так косячу? И хотелось бы избавиться от assume потому ,что цикл состоит совсем не из 2 частей, и парит.
    Спасибо кому не лень это читать.
     
  2. kweed

    kweed New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    81
    сложновато для ассемблера, возможно стоило бы это все на си переписать... ну или паскаль
     
  3. uckuht

    uckuht New Member

    Публикаций:
    0
    Регистрация:
    11 май 2010
    Сообщения:
    8
    kweed
    Та не, я думаю это ламерский вопрос. Нехватает чегото вроде переменной типа дворд, которую потом можно представить как структуру. Гдето, видел что-то похожее , но немогу вспомнить где.
    Param ptr: SOMESTRUCT, или както так. В описании ptr нет такого. Вот и мучаюсь assume.
    На Си или паскале не интересно)).
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Думаю дело в том, что твои Set и Prime обнуляют eax :))
    Рекомендую придерживаться стандартных для win соглашений - подпрограммы сохраняют (или не используют) esi, edi, ebx, ebp, а остальные регистры могут менять.
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Угу если в списке много разнородных объектов, то имхо имеет смысл заюзать виртуальные функции ;))
    Первым полем всех структур объектов будет objectHandler
    Код (Text):
    1. D3DOBJECT_1 STRUCT
    2.    objectHandler dd ?
    3.    field_A dd ?
    4.    field_B dd ?
    5.    ...
    6. D3DOBJECT_1 ENDS
    7.  
    8. D3DOBJECT_2 STRUCT
    9.    objectHandler dd ?
    10.    field_ACD dd ?
    11.    field_BDF dd ?
    12.    ...
    13. D3DOBJECT_2 ENDS
    который заполняется как offset proc_D3DOBJECT_ххх (где proc_D3DOBJECT_ххх соответсвенно функции обработчики объектов) и помимо функции сохранения адреса является ещё и идентификаторм типа объекта (его ведь всё равно нужно где-то хранить чтобы разнородные объекты в списке не перепутались)

    А код рассортировывающий объекты по своим обработчикам будет:
    Код (Text):
    1. mov edi, offset tableLinks
    2. @loop:
    3. mov esi, [edi]
    4. .if esi != 0
    5.      push esi   ; чтобы адрес объекта передавался через стек как параметр proc_D3DOBJECT_xxx, хотя можно и без этого
    6.         ; а просто заключить с самим собой соглашение о передаче адреса объекта через любимый регистр :)
    7.      call [esi]
    8.      add edi, 4
    9.    jmp @loop
    10. .endif
    11. ret
    Тогда подпрограмы-обработчики proc_D3DOBJECT_001, proc_D3DOBJECT_002, и т.д. уже будут привязаны к своим структурам D3DOBJECT_1, D3DOBJECT_2 и накакой путаницы с разнородностью объектов в одном списке уже не будет.
     
  6. uckuht

    uckuht New Member

    Публикаций:
    0
    Регистрация:
    11 май 2010
    Сообщения:
    8
    Y_Mur
    Здорово! При таком подходе можно написать несколько функций обработчиков для одной структуры и разных случаев, а менеджер обьектов сам сможет решать какую ситуацию обрабатывать) Спасибо! Седня попробую.

    Я 2 дня с этим циклом бился), и всеже интересно на будущее - как представить переменную со смещением на обьект структуры, как сам этот обьект, и получить доступ ко всем его элементам? Кроме assume конечно :) Я уверен что видел такой пример, ссылка на манул вполне подойдет ))