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 방향이 다릅니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.