Суть прошу обратить внимание на листинг. Не могли бы ва мне обьяснить для чего компилятор запаял в бинарник вот эту часть ? Хотя я насколько понимаю процедурка только к ECX прибавляет 14h и возвращает это в EAX. Толи у меня крышу рвет, толи у мелкомягких. Причем подобная избыточность по всему бинарнику программы. Спорная часть : Код (Text): .text:0043CCF3 sub esp, 44h .text:0043CCF6 push ebx .text:0043CCF7 push esi .text:0043CCF8 push edi .text:0043CCF9 push ecx .text:0043CCFA lea edi, [ebp+var_44] .text:0043CCFD mov ecx, 11h .text:0043CD02 mov eax, 0CCCCCCCCh .text:0043CD07 rep stosd Полный текст процедуры: Код (Text): .text:0043CCF0 return_eax_ecx_plus_14 proc near ; CODE XREF: sub_43A330+1276p .text:0043CCF0 ; sub_43A330+131Ap ... .text:0043CCF0 .text:0043CCF0 var_44 = byte ptr -44h .text:0043CCF0 var_4 = dword ptr -4 .text:0043CCF0 .text:0043CCF0 push ebp .text:0043CCF1 mov ebp, esp .text:0043CCF3 sub esp, 44h .text:0043CCF6 push ebx .text:0043CCF7 push esi .text:0043CCF8 push edi .text:0043CCF9 push ecx .text:0043CCFA lea edi, [ebp+var_44] .text:0043CCFD mov ecx, 11h .text:0043CD02 mov eax, 0CCCCCCCCh .text:0043CD07 rep stosd .text:0043CD09 pop ecx .text:0043CD0A mov [ebp+var_4], ecx .text:0043CD0D mov eax, [ebp+var_4] .text:0043CD10 add eax, 14h .text:0043CD13 pop edi .text:0043CD14 pop esi .text:0043CD15 pop ebx .text:0043CD16 mov esp, ebp .text:0043CD18 pop ebp .text:0043CD19 retn .text:0043CD19 return_eax_ecx_plus_14 endp
Компилю не я . К тому же софтинка была накрыта Hasp envelop. Может разрабы протупили. Хотя похоже вы правы.
ktoto Если написано на CPP, то скорее всего процедурка возвращает указатель на какой-то член класса (смещение 0х14), а может быть и нет... ЗЫ Изменение скомпилированного кода в дебуг-версии здесь уже обсуждалось.
Насчет класса это понятно. Меня больше смутила конструкция (см. Спорная часть). Вроде как версия релизная и с другой стороны дебаг версия причем частично, может просто как рудимент осталось. К тому же как заметно из кода, данная конструкция больше похожа на веселую растрату ресурсов(потому как подобное присутствует практически в каждой процедурке). Отсюда зреет вопрос (однако сори что слегка оффтопный) как бы покрасивше это дело зафиксить, весьма желательно хотя бы полуавтоматически. P .S. Сырцов естественно не имею
ktoto >> Вроде как версия релизная и с другой стороны дебаг версия причем частично как вариант - была прикомпилена либа собранная в дебаге или наоборот: основной проект в дебаге а либы релизные.
Я сейчас попробовал на С++ (VS 2005) - там нет такого эффекта - вызовы API идут как в FASM - без лишних переходов - даже в Debug Build. Опция "Edit & Continue" также включена.
ktoto Данная процедурка инициализирует область локальных переменных функции кодом 0хCCCCCCCC, чисто дебаг версия, а для чего, а чтобы было видно инициализирована ли локальная переменная вашим кодом или используется вами без инициализации.
Это я понимаю. Пробовал на VC++ в дебаг сборке собирает с такими конструкциями. Но весь прикол в том, что никак не могу добится подобного при сборке релизной. Исследуемое тело собрано релизно, а дебаг заморочки остались все равно. Щас больше склоняюсь к тому что компилятор не всегда пересобирает либы из дебаг в релиз несмотря на выбранную опцию релиз. Вобщем солидарен с господином CreatorCray. Т е Проект собран как релиз, а либы включенные как дебаг. ЗЫ тему можно закрывать.