Всем доброго времени суток. Дело вот в чем: есть у меня структура содержащая указатели на некоторые обьекты-буферы. Есть еще процедура каторая эти обьекты обрабатывает. В теле этой процедуры вызываются функции которым необходим доступ к каждому элементу структуры отдельно. Их работы я не знаю, но буферы динамические, и изменяются этими функциями. Пока обьектов было не много я вызывал свою процедуру для каждого отдельно, и это было достаточно удобно, но теперь их кольчество (обьектов) планируется около 250, и возникла необходимость создавать менеджер обработки. Я решил, что этот менеджер будет выбирать обьекты для обработки и сохранять их указатели(offset) в отдельный буфер после чего передавать управление процедуре-обработчику, который собственно должен извлекать эти указатели по очереди и обрабатывать обьекты пока не встретит 0-указатель, и возвращает управление в главный процесс. Теперь проблемма: не могу получить доступ к каждому элементу структуры отдельно. Разыменую указатель на общий буфер, после разыменовываю первый указатель на структуру. И зависаю. Через assume: представляю регистр, перехожу по элементам, сохраняю, обрабатываю, все работает, но почемуто только для первого елемента общего буфера. Остальные не хотят вылезать. Висну на втором проходе,чотко. Причом если передавать Следущий элемент общего буфера, то но обрабатывается, думаю буфер заполняется правильно. Вот как это примерно выглядит: Код (Text): mov eax,offset pObj mov Objects[0],eax mov eax,offset pObj1 mov Objects[4],eax invoke DAll,Objects[0]; DAll proc Param:DWORD LOCAL x LOCAL y LOCAL z mov eax,[Param] @loop: .if [eax]!=0; если написать так то будет ошибка, но так понятней. assume eax : ptr SOMESTRUCT push [eax].x push [eax].y push [eax].z pop z pop y pop x assume ebx : nothing ;обработчик xyz assume ebx: ptr D3DOBJECT invoke Set,[eax].pBuffer invoke Prime,[eax].SomeBuff,[eax].SomeBuff2 assume ebx : nothing add eax,4 jmp @loop .else ret .endif DAll endp Если элемент 1 то эта конструкция работает, если передать invoke DAll,Objects[4] то обработается именно этот элемент, но где я так косячу? И хотелось бы избавиться от assume потому ,что цикл состоит совсем не из 2 частей, и парит. Спасибо кому не лень это читать.
kweed Та не, я думаю это ламерский вопрос. Нехватает чегото вроде переменной типа дворд, которую потом можно представить как структуру. Гдето, видел что-то похожее , но немогу вспомнить где. Param ptr: SOMESTRUCT, или както так. В описании ptr нет такого. Вот и мучаюсь assume. На Си или паскале не интересно)).
Думаю дело в том, что твои Set и Prime обнуляют eax ) Рекомендую придерживаться стандартных для win соглашений - подпрограммы сохраняют (или не используют) esi, edi, ebx, ebp, а остальные регистры могут менять.
Угу если в списке много разнородных объектов, то имхо имеет смысл заюзать виртуальные функции ) Первым полем всех структур объектов будет objectHandler Код (Text): D3DOBJECT_1 STRUCT objectHandler dd ? field_A dd ? field_B dd ? ... D3DOBJECT_1 ENDS D3DOBJECT_2 STRUCT objectHandler dd ? field_ACD dd ? field_BDF dd ? ... D3DOBJECT_2 ENDS который заполняется как offset proc_D3DOBJECT_ххх (где proc_D3DOBJECT_ххх соответсвенно функции обработчики объектов) и помимо функции сохранения адреса является ещё и идентификаторм типа объекта (его ведь всё равно нужно где-то хранить чтобы разнородные объекты в списке не перепутались) А код рассортировывающий объекты по своим обработчикам будет: Код (Text): mov edi, offset tableLinks @loop: mov esi, [edi] .if esi != 0 push esi ; чтобы адрес объекта передавался через стек как параметр proc_D3DOBJECT_xxx, хотя можно и без этого ; а просто заключить с самим собой соглашение о передаче адреса объекта через любимый регистр :) call [esi] add edi, 4 jmp @loop .endif ret Тогда подпрограмы-обработчики proc_D3DOBJECT_001, proc_D3DOBJECT_002, и т.д. уже будут привязаны к своим структурам D3DOBJECT_1, D3DOBJECT_2 и накакой путаницы с разнородностью объектов в одном списке уже не будет.
Y_Mur Здорово! При таком подходе можно написать несколько функций обработчиков для одной структуры и разных случаев, а менеджер обьектов сам сможет решать какую ситуацию обрабатывать) Спасибо! Седня попробую. Я 2 дня с этим циклом бился), и всеже интересно на будущее - как представить переменную со смещением на обьект структуры, как сам этот обьект, и получить доступ ко всем его элементам? Кроме assume конечно Я уверен что видел такой пример, ссылка на манул вполне подойдет ))