Странное поведение Visual C++

Тема в разделе "WASM.RESEARCH", создана пользователем ktoto, 1 авг 2008.

Статус темы:
Закрыта.
  1. ktoto

    ktoto New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    21
    Суть прошу обратить внимание на листинг. Не могли бы ва мне обьяснить для чего компилятор запаял в бинарник вот эту часть ? Хотя я насколько понимаю процедурка только к ECX прибавляет 14h и возвращает это в EAX. Толи у меня крышу рвет, толи у мелкомягких. Причем подобная избыточность по всему бинарнику программы.


    Спорная часть :
    Код (Text):
    1. .text:0043CCF3                 sub     esp, 44h
    2. .text:0043CCF6                 push    ebx
    3. .text:0043CCF7                 push    esi
    4. .text:0043CCF8                 push    edi
    5. .text:0043CCF9                 push    ecx
    6. .text:0043CCFA                 lea     edi, [ebp+var_44]
    7. .text:0043CCFD                 mov     ecx, 11h
    8. .text:0043CD02                 mov     eax, 0CCCCCCCCh
    9. .text:0043CD07                 rep stosd
    Полный текст процедуры:

    Код (Text):
    1. .text:0043CCF0 return_eax_ecx_plus_14 proc near        ; CODE XREF: sub_43A330+1276p
    2. .text:0043CCF0                                         ; sub_43A330+131Ap ...
    3. .text:0043CCF0
    4. .text:0043CCF0 var_44          = byte ptr -44h
    5. .text:0043CCF0 var_4           = dword ptr -4
    6. .text:0043CCF0
    7. .text:0043CCF0                 push    ebp
    8. .text:0043CCF1                 mov     ebp, esp
    9. .text:0043CCF3                 sub     esp, 44h
    10. .text:0043CCF6                 push    ebx
    11. .text:0043CCF7                 push    esi
    12. .text:0043CCF8                 push    edi
    13. .text:0043CCF9                 push    ecx
    14. .text:0043CCFA                 lea     edi, [ebp+var_44]
    15. .text:0043CCFD                 mov     ecx, 11h
    16. .text:0043CD02                 mov     eax, 0CCCCCCCCh
    17. .text:0043CD07                 rep stosd
    18. .text:0043CD09                 pop     ecx
    19. .text:0043CD0A                 mov     [ebp+var_4], ecx
    20. .text:0043CD0D                 mov     eax, [ebp+var_4]
    21. .text:0043CD10                 add     eax, 14h
    22. .text:0043CD13                 pop     edi
    23. .text:0043CD14                 pop     esi
    24. .text:0043CD15                 pop     ebx
    25. .text:0043CD16                 mov     esp, ebp
    26. .text:0043CD18                 pop     ebp
    27. .text:0043CD19                 retn
    28. .text:0043CD19 return_eax_ecx_plus_14 endp
     
  2. CreatorCray

    CreatorCray Member

    Публикаций:
    0
    Регистрация:
    5 авг 2006
    Сообщения:
    201
    Компилишь явно в дебаге: там много всякого говна добавляется для разного рода дебаговых целей.
     
  3. ktoto

    ktoto New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    21
    Компилю не я :). К тому же софтинка была накрыта Hasp envelop. Может разрабы протупили.
    Хотя похоже вы правы.
     
  4. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    ktoto
    Если написано на CPP, то скорее всего процедурка возвращает указатель на какой-то член класса (смещение 0х14), а может быть и нет...
    ЗЫ
    Изменение скомпилированного кода в дебуг-версии здесь уже обсуждалось.
     
  5. ktoto

    ktoto New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    21
    Насчет класса это понятно. Меня больше смутила конструкция (см. Спорная часть). Вроде как версия релизная и с другой стороны дебаг версия причем частично, может просто как рудимент осталось. К тому же как заметно из кода, данная конструкция больше похожа на веселую растрату ресурсов(потому как подобное присутствует практически в каждой процедурке). Отсюда зреет вопрос (однако сори что слегка оффтопный) как бы покрасивше это дело зафиксить, весьма желательно хотя бы полуавтоматически.

    P .S. Сырцов естественно не имею :)
     
  6. CreatorCray

    CreatorCray Member

    Публикаций:
    0
    Регистрация:
    5 авг 2006
    Сообщения:
    201
    ktoto
    >> Вроде как версия релизная и с другой стороны дебаг версия причем частично
    как вариант - была прикомпилена либа собранная в дебаге или наоборот: основной проект в дебаге а либы релизные.
     
  7. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Я сейчас попробовал на С++ (VS 2005) - там нет такого эффекта - вызовы API идут как в FASM - без лишних переходов - даже в Debug Build. Опция "Edit & Continue" также включена.
     
  8. Vam

    Vam New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2008
    Сообщения:
    149
    ktoto
    Данная процедурка инициализирует область локальных переменных функции кодом 0хCCCCCCCC, чисто дебаг версия, а для чего, а чтобы было видно инициализирована ли локальная переменная вашим кодом или используется вами без инициализации.
     
  9. ktoto

    ktoto New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    21
    Это я понимаю. Пробовал на VC++ в дебаг сборке собирает с такими конструкциями. Но весь прикол в том, что никак не могу добится подобного при сборке релизной. Исследуемое тело собрано релизно, а дебаг заморочки остались все равно. Щас больше склоняюсь к тому что компилятор не всегда пересобирает либы из дебаг в релиз несмотря на выбранную опцию релиз. Вобщем солидарен с господином CreatorCray. Т е Проект собран как релиз, а либы включенные как дебаг.
    ЗЫ тему можно закрывать.
     
Статус темы:
Закрыта.