C언어와 어셈블리어로 스택 프레임 이해하기!
우선 더하기를 해주는 간단한 함수를 만들고 그 함수를 예제로 설명해보겠다.
#include <stdio.h>
int sum(int a, int b) {
return a + b;
}int main(void) {
int c = sum(1, 2);
printf("%d\n",c);
return c;
}
위 함수는 두 인자 a, b 를 받아서 더한 값을 반환한뒤 그 값을 출력해주는 함수이다.
그럼 이제 어셈블리어로 살펴보자
위 사진은 앞서 보았던 함수의 main 부분이다. 순서대로 내려가 보면
push rbp 로 rbp를 깔아주고
mov rsp, rbp 로 rsp를 rbp 위치로 끌고온다.
sub 16, rsp 로 16만큼의 공간을 만들어주고
mov 2, esi 로 esi의 2라는 값을
mov 1, edi 로 edi의 1이라는 값을 넣어준다. 그 후
call sum 으로 sum 함수를 불러주게 된다.
sum 함수의 부분은 이렇게 생겼는데 앞서와 순서는 똑같다.
push rbp 로 rbp를 깔아주고
mov rsp, rbp 로 rsp레지스터를 rbp로 가져와 준다.
mov edi, -4rbp 로 rbp에서 4만큼의 할당받은 공간에 main함수에서 넣었던 edi, 즉, 1이라는 값을 넣어주고
mov esi, -8rbp 로 rbp에서 8만큼 할당받은 공간에 main함수에서 넣었던 esi, 2라는 값을 넣어준다
mov -4rbp, edx 로 연산을 위해 4만큼 할당받은 rbp에 있는 값 즉, 1을 edx레지스터에 넣어주고
mov -8rbp, eax 로 마찬가지로 eax에 2라는 값을 넣어준다.
add edx, eax 로 eax와 edx를 더하여 eax에 더한 3이라는 값을 저장해주고
pop rbp
ret 으로 다시 main 함수로 return 돌아가준다. 이 때 eax는 반환값으로 가지고 돌아간다!
그럼 다시 main 함수 부분으로 돌아와서 그 후에 관한 내용은 아직 공부가 부족하기 때문에 후에 더 공부한 뒤 정리하도록 하겠다.
아무튼 그 후
call printf 로 printf 함수를 불러와 3을 출력해준뒤
leave
ret 으로 다시 main함수를 불러왔던 곳으로 되돌아가 준다.