어셈블리에서의 프롤로그
Redhat 6.2 버전의 구닥다리 환경에서 실습을 진행했다...
처음 배우는 뉴비의 글이니 틀린 정보들이 수두룩 할 것이다...

sample.c
#include <stdio.h>
void main(){
int c;
c = function(1, 2);
}
int function(int a, int b){
char buffer[10];
a = a + b;
return a;
}
해당 코드의 동작은
main()
int c 변수 선언
c 변수에 function(1, 2) 값 대입
function(int a, int b)
char buffer[10] 선언
a 변수에 a와 b를 더한 값을 저장
a값을 반환
으로 동작한다
sample.c의 어셈블리 코드이다. 해당 어셈블리는 intel 기반이 아닌 at&t 문법을 사용하기 때문에 mov a, b 라면 a의 값을 b에 대입한다.
(intel은 b값을 a에 대입)
main :
pushl %ebp
movl %esp, %ebp
subl $4, %esp
pushl $2
pushl $1
call function
addl $8, %esp
movl %eax, %eax
movl %eax, -4(%ebp)
L1 :
leave
ret
function :
pushl %ebp
movl %esp, %ebp
subl $12, %esp
movl 12(%ebp), %eax
addl %eax, 8(%ebp)
movl 8(%ebp), %edx
movl %edx, %eax
jmp .L2
L2 :
leave
ret
prologue란 새로운 함수에 진입했을 때 새로운 함수로 스택 프레임을 초기화 하는 과정이다.
pushl %ebp
movl %esp, %ebp 부분이다.

먼저 pushl %ebp를 하게 되면 현재 ebp레지스터에 저장되있는 값을 push 한다는 뜻이다.
현재 ebp에 저장되어있는 값은 main 함수 이전의 ebp값이고, 그 ebp 값이 저장되게 된것이다.

이후 esp가 가르키고 있는 값을 ebp에 대입하여 현재 esp가 가르키는 곳을 ebp가 가르키게 만들어 새로운 스택 프레임을 만드는 것이다.
이 과정이 프롤로그이다.
call funtion
이후 function 함수로 프롤로그를 살펴보자.

call을 하게 되면 function 함수의 return address를 스택에 push한다. 이 값은 main으로 돌아와서 다음에 실행할 명령어의 주소이다. 이후 function 함수로 이동하게 된다.

function에 진입하자마자 프롤로그가 실행되는 것을 볼 수 있다.
이를 그림으로 살펴보면

pushl %ebp를 통해 main 함수의 ebp 값을 저장한다.

이후에 ebp값을 esp값으로 이동시켜 새로운 function함수를 위한 스택 공간을 할당한 것이다.