티스토리 뷰

Calling Convention과 Stack

콜링 컨벤션과 스택

 

[ Calling Convention ]

  Calling Convention

    : 내부 및 외부 함수 호출을 위한 규칙.

    : 세부적인 정보는 시스템에 따라 다름.

 

[ Procedure Call ]

  · Caller : Callee를 호출.

  · Callee : Caller를 통해 호출당한 함수.

 

  : 항상 복귀가 필요. → 복귀 주소를 항상 Stack에 저장.

     ( 이 Stack을 Call Stack 또는 Run-time Stack이라고 한다. )

     ( jmp instruction과의 차이 : 조건문, 반복문 등에서 사용되던 jmp는 복귀가 강제되지 않았다. )

  : Caller와 Callee는 같은 Register를 사용.

void bfs()		// callee
{
	...
}

int main()
{
	bfs();		// caller
}

 

[ Stack ]

  Run-time Stack

    : Procedure를 관리하기 위한 Memory 공간.

    : Stack Frame의 집합을 저장.

       ※ Stack Frame이란 스택 영역에 함수를 구분하기 위해 생성되는 공간을 말한다.

           함수 호출 시 같이 생성되고, 함수가 종료되면 소멸된다.

    : 2개의 스택 포인터를 필요로 함.

       1) Base Pointer(Frame Pointer) : %rbp. 현재 Stack Frame의 처음 부분을 가리킴. 선택적 요소.

       2) Stack Pointer : %rsp. Stack의 Top을 가리킴. (LIFO 구조의 특성 상 가장 아랫부분) 필수적 요소.

 

  Stack Operation

    · pushq src : 소스에 있는 data를 stack의 top에 추가. → %rsp - 8

    · popq dst : top에 있는 data를 dst에 저장. → %rsp + 8

 

    : 16진수 표기이고, 포인터는 8byte이므로  %rsp의 첫 번째 자리는 무조건 0 또는 8이 나온다.

Stack Operation에 따른 Stack Pointer 변화

  Stack Frame

    · Caller's Stack Frame : 1~6번째 파라미터는 레지스터에, 이후에는 Stack Frame에 저장

                                                   ( 역순으로 Push가 이루어짐. → 낮은 순번의 Parameter가 먼저 나오도록 하기 위함 )

    · Callee's Stack Frame

      - Return Address

      - Old Frame Pointer : 이전에 수행한 함수의 Stack Frame 주소. 선택적 요소.

      - Saved Register Context

      - Local Variable : 지역 변수

      - Argument Build Area : 파라미터가 6개 이상일 때 이용.

Stack Frame

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함