Нужно в С-коде сделать несколько ас вставок и обращаться в них к структурам. ВНЕЗАПНО я понял, что работать со структурами на асме я не умею. Помогите решить несколько примеров. Есть структура: Код (Text): struct { char szName[256]; DWORD qx[10][10]; int a, b; struct { char szSubName[256]; DWORD qx[10][10]; int a, b; } BaseSubStruct; } BaseStruct; // ..... _asm { lea eax, [BaseStruct] }; И так, в еах указатель на структуру. Как теперь (вручную не просчитывая циферки и смещения) обратиться к каждому элементу из данной структуры и подструктуры. Т.е. хочется что-то вроде mov edx, (eax.BaseSubStruct.qx[1][2]) Интересно как обратиться к элементу qx(1;2) в основной и вторичной подструктуре, а так же к szName, и a,b Всем откликнувшимся спасибо!
я в С++ не очень разбираюсь, да и с ассемблером такая же песня, но на вашем месте, сделал бы примерно так: Код (Text): _asm { cld lea esi, [BaseStruct] ; в esi я так понимаю, указатель на начало структуры, а именно на szSubName add esi, 256 ; теперь в esi указатель на массив }
В МАСМе работает так: Код (Text): mov ebx,eax[BaseStruct.a] mov ecx,eax[BaseStruct.BaseSubStruct.b] А вот к элементам двумерных массивов без дополнительного расчета внутреннего смещения вряд ли получится обратиться (если только в особо частных случаях, когда размер среза по внешнему измерению равен 2, 4 или 8 байтов).
Magnum DWORD qx[10][10]; - что это ? В остальном вопрос ваш заключается во вложенности структур. Директива Union поможет.
Код (Text): BASESTRUCT STRUCT szName CHAR 256 dup(?) qx DWORD 10 * 10 dup(?) a UINT ? b UINT ? szSubName CHAR 256 dup(?) qx2 DWORD 10 * 10 dup(?) a2 UINT ? b2 UINT ? BASESTRUCT ENDS LEA EAX, Struct ASSUME EAX : PTR BASESTRUCT LEA ECX, [EAX].qx MOV EDX, 3 * 4 SHL EDX, 2 MOV EDX, DWORD PTR [ECX + EDX] ; EDX = qx[3][4] Наверно как то так...
Malfoy dgs До настоящего момента так и делал... Вот думаю, неправильно это, смещения хардкодить. Dmitry_Milk, K10 Спасибо, работает!