스택 프레임과 호출 규약

코딩 파인애플·2026년 8월 6일

코딩

목록 보기
4/4
post-thumbnail

안녕하십니까 코딩 파인애플입니다
이번 시간에는 레지스터와 어셈블리어의 스택 프레임과 호출 규약에 관해 알아보겠습니다.

메모리와 엔디언

메모리는 그냥 바이트가 주소 순서로 늘어선 거대로 배열입니다
주소는 0x404000, 0x404001... 등 1바이트씩 번호가 매겨집니다

또한 메모리는 용도별로 영역이 나뉘어지는데 각각
-코드 : 실행할 명령어들
-데이터 : 전역 변수 .data의 경우 초기값이 있고 .bss는 0으로 시작함
-힙 : malloc으로 동적 할당하는 영역, 낮은 주소에서 위로 상승
-스택 : 지역변수 및 함수 호출 정보 높은 주소에서 아래로 하강

이러한 바이트끼리 값을 저장할 때 x86-64는 리틀엔디언 방식을 사용합니다
(하위 바이트를 낮은 주소에 먼저 넣음)

에를 들어 메모리에 78 56 34 12이 있으면 값을 뒤집은 0x12345678이 되는 식입니다

반대로 빅 엔디안의 경우 낮은 주소의 데이터에 높은 바이트부터 저장하는 방식을 사용합니다

스택

스택은 자료구조에서나 리버싱에서나 중요한 개념입니다

스택은 LIFO (Least In First Out) 구조로 특이한 성질이 존재합니다
값을 넣을수록 주소가 작아지며 rsp가 항상 꼭대기 (낮은 일대)를 가리킵니다

왜 스택은 높은 주소에서 낮은 주소로 채워지는가?
한정된 메모리를 낭비 없이 사용하려고 힙과 스택이 같은 메모리 공간을 양쪽 끝에서 나눠 쓰면서 서로를 향해 자라도록 하려고

스택 프레임

함수가 호출되면 자기만의 공간 (프레임)을 스택에 만듭니다 이를 프롤로그라고 부릅니다

push rbp          ; 이전 함수의 rbp를 저장 (나중에 복원)
mov  rbp, rsp     ; 현재 스택 꼭대기를 이 함수의 기준점으로 삼음
sub  rsp, 0x20    ; 지역변수 쓸 공간 0x20바이트 확보

call과 ret

call은 반환 주소를 자동으로 스택에 저장하고 함수로 점프합니다

반대로 ret은 이 과정을 되감습니다 스택 꼭대기에 저장된 반환 주소를 꺼내 그리로 점프합니다

leave

함수가 끝날 때 leave는 프롤로그를 되감는 에필로그를 하게 됩니다

leave =
mov rsp, rbp   (지역변수 공간 통째로 버림)
pop rbp        (저장했던 이전 rbp 복원)

호출 규약

함수 호출 규약(Calling Convention)은 함수를 호출할 때 지켜야 하는 약속입니다
즉 "인자를 어디에 넣을 지", "반환값은 어디에 저장할 지", "누가 스택을 정리할지"
를 정해놓은 규칙입니다

Caller와 Callee

함수 호출에는 항상 두 주체가 있습니다.

Caller(호출자) : 함수를 호출하는 함수
Callee(피호출자) : 호출당하는 함수

예컨데

int add(int a, int b){
    return a+b;
}

int main(){
    add(3,5);
}

일 경우
main → Caller
add → Callee
가 되는 꼴입니다.

Windows x64의 호출 규약

컴퓨터 프로그램에서 함수를 호출할 때 매개변수를 전달하는 순서, 레지스터와 스택 사용 방법, 그리고 함수 종료 후 스택을 정리하는 주체에 대한 규칙을 의미합니다

또한 운영체제 및 CPU 아키덱처 (32/64비트)에 따라 호출 규약이 다릅니다

첫 번째부터 네 번째 인자는 레지스터로 전달됩니다

1번째 RCX	2번째 RDX	3번째 R8 	4번째 R9

예를 들어

sum(10,20,30,40); 

이라면

sum(RCX,RDX,R8,R9);

; RCX = 10	RDX = 20
; R8  = 30	R9  = 40

가 됩니다.

5번째 인자부터는 레지스터가 네 개뿐이므로 5번째부터는 스택에 저장됩니다
예를 들어

반환값은 항상 RAX 에 저장됩니다
예를 들어

return 100;

mov eax, 100
ret

처럼 보입니다

이상으로 글을 마치겠습니다 감사합니다.

profile
안녕하떼요취미로콤푸타배우는고든학교6학년유치원생이빈다주말재외하고(러블럭스해야대요💢💢)주중연재하고안한날애눈이월(February)됨니다(안할수도있음)

0개의 댓글