스택에 대한 질문....

Astrid의 이미지

자료구조는 아니고

여기서 본 글이구요...
http://web.kaist.ac.kr/~taekwonv/stack.htm

여기나오는 어셈 코드중에서..

10:
11: void main(void) // main함수의 시작이다.
12: {
00401060 push ebp
00401061 mov ebp,esp
00401063 sub esp,4Ch
00401066 push ebx
00401067 push esi
00401068 push edi
00401069 lea edi,[ebp-4Ch]
0040106C mov ecx,13h
00401071 mov eax,0CCCCCCCCh
00401076 rep stos dword ptr [edi] //여기까지가 준비과정. 그리 신경쓰지 말자.
13: int a;
14: int b;
15: int c;
16:
17: a=1;
00401078 mov dword ptr [ebp-4],1 //지역변수 a의 값을 ebp-4에 기록. 역시 bp-4n의 법칙 따르고 있죠.
18: b=2;
0040107F mov dword ptr [ebp-8],2 //지역변수 b의 값을 ebp-8에 기록. 역시 bp-4n의 법칙을 따릅니다.
19: c=plusFunc(a, b); //esp=12ff28, ebp=12ff80, [ebp-4]=01000000, [ebp-8]=02000000
00401086 mov eax,dword ptr [ebp-8]
00401089 push eax //esp=12ff24(02000000), ebp=12ff80 스택의 값이 줄어들었죠. 스택은 거꾸로 자랍니다.
0040108A mov ecx,dword ptr [ebp-4] //역시 esp만 변할뿐 ebp는 기준점으로 변하지 않죠
0040108D push ecx //esp=12ff20(01000000), ebp=12ff80 인자가 반대순서 2, 1로 들어간 것을 확인합니다.
0040108E call @ILT+0(plusFunc) (00401005) //esp=12ff1c(93104000), ebp=12ff80 현재 esp엔 리턴주소가 들어가죠. 401093 보이시죠
//요녀석의 주소가 401093으로 리턴되면 일루 오죠. 그럼 콜을 따라가보죠.
//piusFunc로 가셨다가 일루 리턴해오세요. 아래로 내려가세요.
00401093 add esp,8 //스택을 두 개 썼으니 두 개 빼줘야죠. 이로써 스택은 복구됨. 뜻을 음미해보세요
00401096 mov dword ptr [ebp-0Ch],eax //지역변수 c가 [ebp-c]에 리턴값 eax를 받아서 저장됨
20: }
00401099 pop edi
0040109A pop esi
0040109B pop ebx
0040109C add esp,4Ch
0040109F cmp ebp,esp
004010A1 call __chkesp (004010c0)
004010A6 mov esp,ebp
004010A8 pop ebp //컴파일러가 스택을 꼼꼼하게 검사해주는군요.
004010A9 ret //리턴. 어디로 리턴될까나?

질문!!!!

00401063 sub esp,4Ch
이것의 의미가 스택프레임을 만들어준다고 했는데...

esp=12ff28일때 push하면 12ff24가 되면서 계속 음으로 자라는데... ebp와 esp사이의 공간은 어떤 용도 인건지요?

Necromancer의 이미지

지역변수 저장용입니다.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.