Метка в структуре

Тема в разделе "WASM.BEGINNERS", создана пользователем Gennadiy_M, 9 ноя 2009.

  1. Gennadiy_M

    Gennadiy_M New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    22
    Можно ли поставить метку в структуре в MASM'е? Например есть структура:

    my struc
    musor1 dd ?
    my_str db 10 dup (?)
    my_str_end = $ - offset my
    musor2 dd ?
    my ends

    Можно ли как-нибудь прописать my_str_end так, чтобы доступ к нему был как к "my.my_str_end"?

    "my_str_end equ musor2" не нравится!
     
  2. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    Код (Text):
    1. my struc
    2.    musor1 dd ?
    3.    my_str db 10 dup (?)
    4.   union
    5.    my_str_end dd ?
    6.    musor2 dd ?
    7.   ends
    8. my ends
     
  3. Gennadiy_M

    Gennadiy_M New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    22
    Спасибо.
    Жаль, что нельзя в структуре метку поставить без "резервирования" памяти.
     
  4. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    Gennadiy_M,
    Код (Text):
    1. ;my struc
    2.   musor1        = 0
    3.   my_str        = 4
    4.   my_str_end = 10+4
    5.   musor2       = 10+4
    6. ;my ends
    в итоге: my_str_end = musor2
    о каком резервировании речь?
     
  5. Gennadiy_M

    Gennadiy_M New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    22
    Мне было бы удобней так:

    my struc
    musor1 dd ?
    my_str db 10 dup (?)
    my_str_end:
    musor2 dd ?
    my ends

    Нет, так нет. Просто при программировании частенько структура сильно меняется. Получается, чтобы определить смещение конца my_str мне надо ссылаться на следущестоящий элемент (а если его нет?). Можно конечно и "my_str_end = $", но мне нужно, чтобы доступ к смещению был как "my.my_str_end". Всё это для культуры программирования и если нет простого решения, то буду как раньше.
     
  6. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    Gennadiy_M,
    это бред>>
    Код (Text):
    1.   musor1 = 0
    2.   my_str = 4
    3. my_str_end:
    4.   musor2 = 14
     
  7. arrrg

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    эм,вставлю свои 5 копеек
    никаких меток ненадо
    если уж так припекло,то обьяви структуру так -
    Код (Text):
    1. my struc
    2.   musor1 dd ?
    3.   my_str db 10 dup (?)
    4.   strend db 1;это какбы вместо метки
    5.   musor2 dd ?
    6. my ends
    потом
    Код (Text):
    1. lea esi,my.strend;получаем указатель на следующий элемент структуры
    2. dec esi
    (вместо esi используй любой нужный тебе регистр.именно НУЖНЫЙ)
    потом можно будет обращатся к этому элементу из регистра esi,например
    Код (Text):
    1. mov eax,'1'
    2. mov [esi],eax
    таким образом в конец строки будет перемещён символ '1'
    это было во первых
    ---------------------------------------------------------------------
    во вторых....зачем так извращённо,когда можно просто
    Код (Text):
    1. lea esi,my.my_str;получаем указатель на начало строки(т.е. на нулевой элемент массива байт)
    2. add esi,10;добавляем 10 и получаем указатель на конец строки(т.е. на десятый элемент массива байт)
    потом можно будет обращатся к этому элементу из регистра esi,например
    Код (Text):
    1. mov eax,'1'
    2. mov [esi],eax
    таким образом в конец строки будет перемещён символ '1'
    ---------------------------------------------------------------------
    в третьих.если не устраивают варианты выше ,то
    Код (Text):
    1. lea esi,[my.strend-1]
    (опять таки,обращение через регистр.если регистры заняты,"перебрось" значение какоголибо выбранного тобой регистра через стёк(т.е. push esi <потом код> pop esi)
     
  8. arrrg

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    забыл добавить - если строки предназначаются для функций winapi,то лучше присобачь ещё нулевое окончание
     
  9. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Человек борется за культуру, а ты предлагаешь еще большее извращение.

    Вот как надо :
    Код (Text):
    1.   my_str_end db 0 dup (?)
    Элементарно, работает и не резервирует.
    Правда это стоило мне час секса с MASM32. Пока не задал имена структуры большими буквами не работало... Хрень какая-то :-(
     
  10. arrrg

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    забавно
    надо взять на заметку))
     
  11. Gennadiy_M

    Gennadiy_M New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    22
    "my_str_end db 0 dup (?)" - это то, что надо. Красота исходника спасена.