Как на асм-е работать со структурами. Проконсультируйте нуба.

Тема в разделе "WASM.BEGINNERS", создана пользователем Magnum, 6 янв 2012.

  1. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Нужно в С-коде сделать несколько ас вставок и обращаться в них к структурам.
    ВНЕЗАПНО я понял, что работать со структурами на асме я не умею.
    Помогите решить несколько примеров.

    Есть структура:

    Код (Text):
    1. struct
    2. {
    3.    char szName[256];
    4.    DWORD qx[10][10];
    5.    int a, b;
    6.    struct
    7.    {
    8.       char szSubName[256];
    9.       DWORD qx[10][10];
    10.       int a, b;
    11.    } BaseSubStruct;
    12. } BaseStruct;
    13.  
    14. // .....
    15.  
    16. _asm
    17. {
    18.  lea eax, [BaseStruct]
    19. };
    И так, в еах указатель на структуру.
    Как теперь (вручную не просчитывая циферки и смещения) обратиться к каждому элементу из данной структуры и подструктуры.
    Т.е. хочется что-то вроде mov edx, (eax.BaseSubStruct.qx[1][2])

    Интересно как обратиться к элементу qx(1;2) в основной и вторичной подструктуре, а так же к szName, и a,b :)
    Всем откликнувшимся спасибо!
     
  2. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    я в С++ не очень разбираюсь, да и с ассемблером такая же песня, но на вашем месте, сделал бы примерно так:

    Код (Text):
    1. _asm
    2. {
    3. cld
    4. lea esi, [BaseStruct] ; в esi я так понимаю, указатель на начало структуры, а именно на szSubName
    5. add esi, 256 ; теперь в esi указатель на массив
    6. }
     
  3. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    В МАСМе работает так:
    Код (Text):
    1. mov ebx,eax[BaseStruct.a]
    2. mov ecx,eax[BaseStruct.BaseSubStruct.b]
    А вот к элементам двумерных массивов без дополнительного расчета внутреннего смещения вряд ли получится обратиться (если только в особо частных случаях, когда размер среза по внешнему измерению равен 2, 4 или 8 байтов).
     
  4. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Magnum
    DWORD qx[10][10]; - что это ?

    В остальном вопрос ваш заключается во вложенности структур. Директива Union поможет.
     
  5. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Код (Text):
    1. BASESTRUCT STRUCT
    2.   szName    CHAR 256 dup(?)
    3.   qx        DWORD 10 * 10 dup(?)
    4.   a         UINT ?
    5.   b         UINT ?
    6.   szSubName CHAR 256 dup(?)
    7.   qx2       DWORD 10 * 10 dup(?)
    8.   a2        UINT ?
    9.   b2        UINT ?
    10. BASESTRUCT ENDS
    11.  
    12.  
    13.   LEA EAX, Struct
    14.   ASSUME EAX : PTR BASESTRUCT
    15.   LEA ECX, [EAX].qx
    16.   MOV EDX, 3 * 4
    17.   SHL EDX, 2
    18.   MOV EDX, DWORD PTR [ECX + EDX] ; EDX = qx[3][4]
    Наверно как то так...
     
  6. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Malfoy
    [​IMG] [​IMG] [​IMG] [​IMG] [​IMG] [​IMG] [​IMG] [​IMG]


    dgs
    До настоящего момента так и делал... Вот думаю, неправильно это, смещения хардкодить.

    Dmitry_Milk, K10
    Спасибо, работает!