c언어로 작성된 짧은 예제를 디버깅해서 나온 어셈블리어에 대한
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등등이 어떤때에 쓰이는지는 잘모르겠습니다.
완벽한 답이 아니더라도 조언부탁드립니다.


Re: c언어로 작성된 짧은 예제를 디버깅해서 나온 어셈블리어에
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 방향이 다릅니다.
---
http://coolengineer.com
댓글 달기