어셈블리어 레지스터 질문

qkrwncks593의 이미지

어셈블리어를 배우고있는데 레지스터에대해 이해가 잘안갑니다.

1. 메인함수에 있는  short a=2; char b=5;   변수선언코드의 역어셈블 코드를 보면

처음에 부터시작하면

push ebp
mov ebp,esp
sub esp,0x4 // 여기서 esp 에서 4를 빼는 이유를 모르겠습니다 ; 스택메모리를 할당한다는데 왜 esp 에서 4를 뺀다는건지 이해가안가요
..
..
mov word ptr [ebp-2],0x2
mov byte ptr [ebp-3],0x5

여기서 또 왜 값을 대입할때 esp 를 이용하지않고 ebp 를 사용해서 메모리에 값을 대입하는거죠 ?

마지막으로 스택에 메모리공간을 할당할때 push 를 사용하는데 왜 sub 를 사용하는지 정말 이해가 안갑니다. 이거에대해 자세히 설명해주세요 ㅠ

익명 사용자의 이미지

1. sub esp,0x4 // 여기서 esp 에서 4를 빼는 이유를 모르겠습니다 ; 스택메모리를 할당한다는데 왜 esp 에서 4를 뺀다는건지 이해가안가요

스택은 역방향으로 자라기 때문에 stack pointer를 감소시키면 그만큼 스택에 데이터를 push한 것과 같은 효과를 나타냅니다. 3 바이트가 필요하기 때문에 IA32의 stack pointer 최소 정렬 단위인 4 바이트를 할당합니다.

2. 여기서 또 왜 값을 대입할때 esp 를 이용하지않고 ebp 를 사용해서 메모리에 값을 대입하는거죠 ?

call 과정에서 stack pointer의 값은 항상 변합니다. 따라서 처음 시작 할 때 저장해 둔 esp 값을 기준으로 계산하게 됩니다. 일일이 증가값 감안해서 esp로 계산할 수도 있겠지만 그렇게 하려면 컴파일러의 구현이 복잡해집니다.

3. 마지막으로 스택에 메모리공간을 할당할때 push 를 사용하는데 왜 sub 를 사용하는지 정말 이해가 안갑니다.

스택에 1024 바이트 할당 하겠다고 push를 256번 실행하겠습니까?

Stand Alone Complex의 이미지

아래 링크 자료가 도움이 되실 것 같습니다.

https://docs.google.com/viewer?url=http://www.dumpanalysis.org/PFD/Practical_Foundations_of_Debugging_Chapter6_2.pdf

특히 위 링크에서 4번 슬라이드를 보시면 이해가 쉬우실 것 같네요.

RET ;My life :P

익명 사용자의 이미지

알려주신 URL 이 중간에 짤린듯 합니다.

아마도 전체 URL 은 아래와 같지 않을까 예상됩니다.
https://docs.google.com/viewer?url=http://www.dumpanalysis.org/PFD/Practical_Foundations_of_Debugging_Chapter5.pdf

익명 사용자의 이미지

전체 URL 을 적어도 짤려 보이는 거였군요. 다시 적습니다.

5. Memory and Stacks

익명 사용자의 이미지

문서보고 이해했습니다 ㅎㅎㅎ.

익명 사용자의 이미지

지역변수를 위한 스택에서
esp는 스택의 top이고 ebp는 스택의 bottom입니다.

qkrwncks593의 이미지

ebp 값을 더낮게 줄이면 스택영역이 줄으는건가요 ?

댓글 달기

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