Доброго времени суток всем. Есть несколько вопросов по MSVC 6. 1. Создаю проект приложения с GUI, в котором используется компилирую, Трассирую с использованием отображения ассемблерных команд. Теперь сам вопрос: как избавиться от мусора вставляемого компилятором в начале функции, а именно: 00401080 push ebp 00401081 mov ebp,esp 00401083 sub esp,40h 00401086 push ebx 00401087 push esi 00401088 push edi 00401089 lea edi,[ebp-40h] 0040108C mov ecx,10h 00401091 mov eax,0CCCCCCCCh 00401096 rep stos dword ptr [edi] и компенсирующего кода в конце: 0040109A pop edi 0040109B pop esi 0040109C pop ebx 0040109D mov esp,ebp 0040109F pop ebp 004010A0 ret 2Ch 2. Если я устанавливаю "Ignore all defalt libraries" и указываю точку входа, то получаю ошибку линкера: error LNK2001: unresolved external symbol __chkesp, а всё потому, что линкер вставляет 00401068 call __chkesp (00401110) после процедуры Main(это точка входа). Что сделать, чтобы он этого не делал? 3. почему после "ret" из 1го вопроса стоит 2Ch - что это? 4. Во встроенном в VC асме нельзя обратиться к регистру EIP. Например, на конструкию _asm{ push EIP pop EAX } компилятор выдаёт error C2094: label 'EIP' was undefined. Как можно получить адрес текущей команды? Заранее спасибо всем комрадам, которые осчастливят меня ответами
1) Не нравиться - пиши на асме . 2) Если уж сильно припрёт то пользуйся NAKED функциями. 3) Перейди в режим релиза, чтобы избавиться от __chkesp. 4) Можно и стартап-функцию покорёжить... Смотря какая у тебя задача. P.S. У Крисса Касперского довольно хорошо описано то о чём ты спрашиваешь.
DelExe, спасибо, посмотрю у Касперского. Если помнишь скажи в какой книжке - у него их много..... за идею про NAKED ваще отдельное спасибо. Не знал.
infern0, push EIP я использовал ещё в детстве в DOS'овском tasm'е от Borland'а для определения текущего местоположения (если мне склероз не изменяет - это было 7 лет назад), а вот, например, mov eax,eip я сделать не мог...
0CCCCCCCCh - признак _DEBUG версии, поэтому начать надо с выключения этого режима. После этого не будет возможности остановки в дебаггере, но этому легко помочь - ставь INT 3 где надо: Код (Text): void foo () { _asm int 3 // ... your code here ... } Далее, надо начинать перебирать опции компилятора - в общем поэкспериментировать. Я получил очень неплохой код от этого компилятора. Следующия версия (VS .NET 2003), надо сказать, получше будет - здорово код генерирует, функция вот так выглядит: Код (Text): ; function entry point SUB ESP, local_variables_room ... all parameters and locals with [ESP + ofs] ADD ESP, local_variables_room RET
Отладчик замечально работает и в Release Build. Это делает и VC6, если включить /Oy (enable frame pointer omission). По умолчанию включено в Release Build. А вместо push eip надо использовать такой код: Код (Text): call dummy :dummy pop eax Регистр eip напрямую недоступен никаким образом, а только косвенно через команды передачи управления (jmp, call, (i)ret, int).