함수호출시 부하관련 질문입니다..

kaiji75의 이미지

함수호출시에 전달 인자와 함께 리턴어드레스와 이전 스택프레임 포인터를 스택에 push 하는 과정이 내부적으로 일어나는걸로 알고 있는데 혹시 그와 함께 이전에 레지스터 정보(가령 EAX, EBX, ECX 와 같은..)도 저장할 필요가 있을꺼 같은데요...
왜냐하면 그렇지 않는다면 함수리턴후 리턴어드레스부터 다시 수행해나갈때 기존의 레지스터정보가 다른값으로 변경될수가 있을테니깐요..
혹시 맞다면 기존 함수에서 연산중인 데이타를 담아두었던 레지스터값은 어디에 저장되는지...(혹시 커널모드스택?) 아니라면 그 이유가 무었인지 궁금하구요..
그렇다면 흔히 말하는 함수 호출시의 '오버헤드'라는것이 함수 호출전후 데이타를 스택에 PUSH, POP 하는 과정만을 말하는 것인지도 궁금합니다... 초보스러운 질문이라도 너그러운 답변 부탁드립니다.. :?

flyduck의 이미지

함수 호출할 때 레지스터를 어떻게 사용하고 스택을 어떻게 사용하는지는 Application Binary Intarface (ABI)라는 것에 정의되어 있습니다. CPU마다 다르고 운영체제나 컴파일러에 따라서 조금 달라질 수 있습니다. 인텔환경에서 리눅스는 System V ABI를 따릅니다. (http://www.caldera.com/developers/devspecs/abi386-4.pdf)

인텔 환경에서 함수를 호출할 때 ebx, ebp, esi, edi, esp는 저장해야 하는 레지스터이고, 나머지 레지스터는 함수에서 맘대로 바꿀 수 있는 레지스터입니다. 따라서 함수를 호출하기 전에 맘대로 바꿀 수 있는 레지스터(예를 들어 eax)같은 레지스터의 경우 필요에 따라 저장을 해야하고, 함수가 불린 쪽에서는 저장해야 하는 레지스터를 사용하는 경우 (예를 들어 ebx) 불린 다음 저장을 하고 함수를 마치기 전에 복구를 해주어야 합니다. 레지스터는 모두 사용자 모드 스택에 저장됩니다.

오버헤드라면 함수를 호출하기 위해서 스택에 레지스터를 저장하고 복구하고, 인자를 스택에 저장하고, 스택에서 꺼내고, cache miss가 생기는 것 등등을 모두 포함합니다.

Freedom is another word for nothing left to lose,
Nothing doesn't mean nothing if it ain't free.

kaiji75의 이미지

답변 감사합니다. ^^

flyduck 님의 답변을 "ebx, ebp, esi, edi, esp 레지스터는 호출되는 함수에서 사용할 필요가 있을때에는 그것을 자신의 사용자 모드 스택에 넣고 저장한후 레지스터 사용후 리턴되기전에 스택에서 꺼내어 해당레지스터를 복원하며 나머지 레지스터를 사용할시에는 호출되는 함수에서는 이런 과정없이 바로 사용하며 굳이 이값을 나중에 써야 한다면 호출하는 함수 쪽에서 사용자 모드 스택에 저장해놓고 함수를 호출해야한다." 라고 이해 했는데 맞게 이해한건가요?

댓글 달기

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