[질문] 어셈소스중 이해안가는 부분이 있어 질문드립니다.

keston의 이미지

"programming from the ground up" 이란 책으로 어셈 공부중인데요..
책에 나와있는 소스인데 잘 이해가 안되는 부분이 있어 질문드립니다.

     1          .section .data
     2
     3          .section .text
     4
     5          .globl _start
     6          .globl _factorial
     7
     8  _start:
     9          pushl $4
    10          call factorial
    11          addl $4, %esp
    12          movl %eax, %ebx
    13          movl $1, %eax
    14          int $0x80
    15
    16          .type factorial, @function
    17  factorial:
    18          pushl %ebp
    19          movl %esp, %ebp
    20          movl 8(%ebp), %eax
    21          cmpl $1, %eax
    22          je end_factorial
    23          decl %eax
    24          pushl %eax
    25          call factorial
    26          movl 8(%ebp), %ebx
    27          imull %ebx, %eax
    28
    29  end_factorial:
    30          movl %ebp, %esp
    31          popl %ebp
    32          ret

보시다시피 4 factorial 을 구하는 건데요..
제 생각에는 11-14번 라인은 실행이 안될거 같거든요..
제가 생각하는 실행흐름은..
10번 라인에서 factorial 함수를 call 한후 18-25까지 eax 레지스터 값이 1이 될때까지 반복된후 1이면 30-32를 실행한후 26라인으로 리턴한후 26-27을 실행하고 종료될거 같거든요..
call instruction 으로 다른곳으로 분기된후 ret instruction이 없으면 call 다음 instruction은 실행되지 않는거 아닌가요?

답변에 미리 감사드립니다. :D

pynoos의 이미지

27 번다음으로 30,31,32 가 차례로 실행된 뒤에 돌아 가겠죠?

Necromancer의 이미지

call은 스택에 복귀주소를 집어넣습니다.

ret는 복귀주소를 스택에서 꺼내서 그곳으로 복귀시킵니다.

....

실제 스택의 복귀주소 저장자리에 mov명령으로 딴데 쓰면 그곳으로 복귀됩니다.

bof가 이걸 이용합니다.

Written By the Black Knight of Destruction

owlet의 이미지

8~10 -> 17~25 -> 17~25 -> 17~25 -> 17~22 -> 29~32 -> 26~32
-> 26~32 -> 26~32 -> 26~32 -> 11~14
정도가 될 것 같네요

keston의 이미지

답변 감사합니다.
아..이런..저 소스를 수십번을 봤는데도 end_factorial을 함수로 생각하고 있었네요.. :oops:

댓글 달기

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