[완료] 함수 호출시 esp 관련 질문
글쓴이: hongwoo / 작성시간: 금, 2009/05/08 - 1:03오후
swap.c 가 아래와 같이 되어있고.,
void swap(int *a, int *b) { int t = *a; *a = *b; *b = t; }
gcc -S swap.c
해서.. swap.s를 보면 esp를 16만큼 줄이는데요..,
.file "swap.c" .text .globl swap .type swap, @function swap: pushl %ebp movl %esp, %ebp subl $16, %esp movl 8(%ebp), %eax movl (%eax), %eax movl %eax, -4(%ebp) movl 12(%ebp), %eax movl (%eax), %edx movl 8(%ebp), %eax movl %edx, (%eax) movl 12(%ebp), %edx movl -4(%ebp), %eax movl %eax, (%edx) leave ret .size swap, .-swap .ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3" .section .note.GNU-stack,"",@progbits
왜 16이어야 하는지 잘 모르겠습니다. 4로도 충분할텐데요..
왜 일까요 ??
Forums:
gcc는 최적화를 하지
gcc는 최적화를 하지 않으면 실제 사용 여부에 관계 없이
모든 automatic variable에 대한 공간을 확보해 놓는 듯 합니다.
a, b, t 모두 4 byte 씩 12 byte 인데,
8-byte alignment 에 의해 16 byte를 할당하는 것 같네요.
최적화 옵션을 주고 컴파일 하시면 아마 스택을 전혀 사용하지 않는 코드를 생성할 겁니다.
O1, O2등으로
O1, O2등으로 해봤는데., 전혀 다른 asm 코드들이 나오네요.
local variable 에 대한 공간이 16byte에 맞춰지는거 같습니다. 매개변수는 스택에 쌓이구요.
감사합니다 ~
-----------------------------
in the real-time scheduler !
웁쓰. x86에서
웁쓰. x86에서 파라미터는 무조건 스택으로 넘기는 건데 깜빡했습니다.
레지스터 패싱이라고 생각하고 매개변수도 쳤네요. ^^;;
x86에서 스택 프레임은 16-byte alignment 가 맞네요.
댓글 달기