помогите разобраться с майкрософтовским компилятором - не могу понять как он код генерирует Code (Text): ;int __stdcall Summ(int a,int b){ 00AB13C0 push ebp ;сохраняет регистр в стеке 00AB13C1 mov ebp,esp ;сохраняет указатель стека в регистре 00AB13C3 sub esp,0CCh ; для чего меняет вершину стека? 00AB13C9 push ebx ;\ 00AB13CA push esi ; >сохраняет регистры в новом стеке 00AB13CB push edi ;/ 00AB13CC lea edi,[ebp-0CCh] ; далее хитрые манипуляции которые я не понимаю 00AB13D2 mov ecx,33h 00AB13D7 mov eax,0CCCCCCCCh 00AB13DC rep stos dword ptr es:[edi] ; int c=a+b; 00AB13DE mov eax,dword ptr [a] ; \ 00AB13E1 add eax,dword ptr [b] ; >всё вроде хорошо только как он вычислил адреса 00AB13E4 mov dword ptr [c],eax ; / ; return c; 00AB13E7 mov eax,dword ptr [c] ;} 00AB13EA pop edi ; \ 00AB13EB pop esi ; > восстановление регистров из нового стека 00AB13EC pop ebx ; / 00AB13ED mov esp,ebp ;восстановление стека 00AB13EF pop ebp ;восстановление регистра 00AB13F0 ret 8 ;возврат и уменьшение стека на 2*4 байта
push ebp mov ebp,esp sub esp,<> это стандартный пролог функции, в ebp сохраняется указатель стека и по нему адресуются аргументы (ebp + <>) и локальные переменные (ebp - <>). Размер локальных переменных и есть 0CCh, под которые инструкцией sub резервируется место. У тебя видимо по отладочной информации локальные переменные сами подставились, если это недоразумени убрать там будет mov [ebp - <>],<>, и соответственно, адреса локальных были вычислены при компиляции. rep stosd заполняет поле по указателю edi количеством ecx данных eax. За каким смыслом майкрософтовский компилятор в эпилоге функции не использовал инструкцию leave вместо mov esp,ebp; pop ebp надо у майкрософт спрашивать.
_evil, Хороший и годный подход, возникла куча вопросов. Вы должны сами разобраться, изучить предмет и найти ответы. Мой вам совет - не слушайте никого, а используйте системную документацию. Вы просто не понимаете как это всё устроено, но а опираться на какие то мнения - глупо, это навредит. Ответивший выше вам человек - глупый школьник, который знает немного набор инструкций и может по этой причине что то бредовое отвечать. Разбираться в этом если интересно нужно самому, зачем спрашивать базовую инфу.
переключил в release и применил нормальный дизасемблер push ebp mov ebp,esp push ecx mov eax,[ebp+08h] add eax,[ebp+0Ch] mov [ebp-04h],eax mov eax,[ebp-04h] mov esp,ebp pop ebp retn 0008h стало всё понятно ...