c언어로 작성된 짧은 예제를 디버깅해서 나온 어셈블리어에 대한

gyxor의 이미지

void main(int argc, char *argv[])
{
int a = 0;
a = a + 1;
return;
}
이러한 c언어 예제를 컴파일한후 디버깅해서 나온 어셈블리어에 주석을 달아야하는데요
제가 해봤는데 맞는것인지 모르겠습니다.
고수님들의 .. 검토부탁드립니다.

--- C:\My Documents\Cpp1.cpp ----------------------------------------------------------------------------------------------
1: #include<stdio.h>
2:
3: void main(int argc, char *argv[])
4: {
00401010 push ebp ;ebp에 값을 저장
00401011 mov ebp,esp ;ebp의 값을 esp로 이동
00401013 sub esp,44h ;esp - 44h 를 esp로 저장
00401016 push ebx ;?
00401017 push esi ;?
00401018 push edi ;?
00401019 lea edi,[ebp-44h] ;?
0040101C mov ecx,11h ;ecx에 11h 저장
00401021 mov eax,0CCCCCCCCh ;eax에 OCCCCCCCCh 저장
00401026 rep stos dword ptr [edi] ;?
5: int a = 0;
00401028 mov dword ptr [ebp-4],0 ;?
6: a = a + 1;
0040102F mov eax,dword ptr [ebp-4] ;eax에 dword형태로 ptr[ebp-4] 저장
00401032 add eax,1 ;eax 에 1증가
00401035 mov dword ptr [ebp-4],eax ;?
7: return ;
8:
9: }
00401038 pop edi ; edi에서 값을 불러옴
00401039 pop esi ; esi에서 값을 불러옴
0040103A pop ebx ; ebx에서 값을 불러옴
0040103B mov esp,ebp ; esp에 ebp값을 저장
0040103D pop ebp ; ebp에서 값을 불러옴
0040103E ret ; ?
--- No source file -------------

아무래도 거의다 틀렸다고 생각합니다.
이해도 edi esi ebx esp ebp등등이 어떤때에 쓰이는지는 잘모르겠습니다.
완벽한 답이 아니더라도 조언부탁드립니다.

pynoos의 이미지

void main(int argc, char *argv[])

--- C:\My Documents\Cpp1.cpp  ----------------------------------------------------------------------------------------------
1:    #include<stdio.h>
2:
3:    void main(int argc, char *argv[])
4:    {
00401010   push        ebp                     ;이전 함수의 stack frame 을 저장
00401011   mov         ebp,esp                 ;이 함수의 stack frame 을 ebp에 세팅 (esp 를 ebp로 이동하는 것입니다.)
00401013   sub         esp,44h                 ;스택에 44h byte 확보 (Windows 에서 debug mode죠? 그렇다면, 변수갯수와 상관없이 넉넉하게 잡습니다.)
00401016   push        ebx                     ;ebx 값 대피
00401017   push        esi                     ;esi 값 대피
00401018   push        edi                     ;edi 값 대피
00401019   lea         edi,[ebp-44h]           ;확보한 스택의 44h byte를 (CCh로) 초기화 (4*11h)
0040101C   mov         ecx,11h                 ;continue
00401021   mov         eax,0CCCCCCCCh          ;continue
00401026   rep stos    dword ptr [edi]         ;초기화가 실제로 일어남.
5:    int a = 0;
00401028   mov         dword ptr [ebp-4],0     ; 이 함수의 stack frame의 최상위 4byte(변수 a)에 0 을 대입
6:    a = a + 1;
0040102F   mov         eax,dword ptr [ebp-4]   ;eax에 dword형태로 ptr[ebp-4] 저장
00401032   add         eax,1                   ;eax 에 1증가 
00401035   mov         dword ptr [ebp-4],eax   ;다시 eax 넣음.
7:    return ;
8:
9:    }
00401038   pop         edi                     ; edi에서 값을 불러옴
00401039   pop         esi                     ; esi에서 값을 불러옴
0040103A   pop         ebx                     ; ebx에서 값을 불러옴 
0040103B   mov         esp,ebp                 ; 함수가 불린직후 스택 복원 
0040103D   pop         ebp                     ; 이전 stack frame 복원 
0040103E   ret                                 ; main 함수를 부른 C runtime startup code로 복귀
--- No source file  -------------

용어는 틀릴 수 있습니다.

gcc 에 수반되는 assembler와 Windows debugger에 수반되는 disassembler가 mov 방향이 다릅니다.