어셈 질문입니다.

살자의 이미지

안녕하세요..
제가 지금 어셈을 공부하는 초보 인데여..
궁금한것이 있어서 이렇게 질문 드립니다..
고수님들의 많은 조언 부탁드립니다.

c code를 gcc -S -o t.s t.c 를 사용하여 어셈으로 만들었는데여...

#include <stdio.h>
int main()
{
}

asm code

        .file   "t.c"
        .text
        .align 2
.globl main
        .type   main,@function
main:
        pushl   %ebp
        movl    %esp, %ebp
////////////////////////////////////////////////////
        subl    $8, %esp
        andl    $-16, %esp
        movl    $0, %eax        
///////////////////////////////////////////////////
        subl    %eax, %esp
        leave
        ret
.Lfe1:
        .size   main,.Lfe1-main
        .ident  "GCC: (GNU) 3.2 20020903 (Red Hat Linux 8.0 3.2-7)"


표시된 부분의 코드가 이해가 되질 않습니다..
어떤 작업을 하는 코드인지.. main 함수가 들어간 코드에만 저렇게 나오는데..
잘 이해가 가질 않습니다...

그럼 미리 감사 합니다....

pynoos의 이미지

subl $8, %esp
는 8 byte 만큼 로컬 변수를 위한 공간을 확보하라는 것이구요.
andl $-16, %esp 는 %esp 값을
11111111 11110000 으로 마스킹한 값을 취하라는 것인데, 즉 address alignment를 16의 배수로 하라는 것이 되겠네요.

그 다음줄은 eax에 0을 넣으라는 얘기군요. 대개 int 형을 돌리는 함수의 return 값을 전달할 때 쓰입니다.

jenix의 이미지

Programming from the ground 란 책을 ( 온라인 pdf 문서도 있습니다. ) 보시면 많은 도움이 될듯 한데..음.. 정말 좋더라구요. ( 전 책으로 구매했다는..히히.. )

gcc 에선 기본적으로 스택오버플로 방지를 위해 저렇게 주소를 미는 거라고 들었는데요.. ( 저도 질문이 되는거같습니다. 제가 알고 있는게 정확한지 궁금해서요 ^^; )

-mpreferred-stack-boundary=2 옵션으로 주고 컴파일 해보시면 저렇게 스택을 밀어주는 어셈 코드가 사라집니다.

---------------------------------------------------------------------------
http://jinhyung.org -- 방문해 보세요!! Jenix 의 블로그입니다! :D

sodomau의 이미지

음... 스택을 미는 거라뇨?

  subl    $8, %esp 

이거 말씀하시는건가요?
스택에 ret어드레스랑 ebp가 저장되고 난 후에 8씩
빼 주는건 메모리 alignment를 16바이트로 맞춰줬을때
일반적인 function의 처음에 항상 나오는 걸로
알고 있는데...
그래야 ret어드레스 4바이트, ebp 4바이트, 그리고 8바이트로
16바이트 alignment가 맞춰지잖아요.
앞의 코드 보니 왠지 andl $-16, %esp 랑 중복되는거 같아서
이상하긴 하지만 아무튼 그런 이유로 알고 있습니다.
인텔의 몇몇 인스트럭션의 경우가 16바이트로 맞춰줬을때
가장 빠르게 돌아간다고 해서 그런 걸로 알고 있고요.

사실 저렇게 미는걸로 스택 오버플로우 공격같은걸
막는건 눈가리고 아웅하기 식일텐데요;

저도 잘 몰라서... 자세히 아시는분 안계신가요? :)

jenix의 이미지

음..
집에 와서 찾아보니까..
오버플로우 막는건 아니군요 -_-;; ( 죄송; )
음.... 확실한건..
gcc 에서 사용하는 스택구조가 2.95 이후로 변경되었다는데..
-mpreferred-stack-boundary=2 옵션은.. 2.95 이전의 스택 구조를 사용하기위함이라는 군요 ^^;
( 잘못 알고있었네요.. 죄송 ^^; 하나 더 배워갑니다. )

---------------------------------------------------------------------------
http://jinhyung.org -- 방문해 보세요!! Jenix 의 블로그입니다! :D

댓글 달기

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