ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 함수호출 최종정리
    @ 16. 1 ~ 17. 1/면접관련 2016. 12. 4. 17:47

    스텍 세그먼트는 메모리..스택, 코드, 데이터, 힙 이런것..

    스택 프레임이란 함수가 호출 될 때마다 함수 호출을 위해 할당 받는 메모리 덩어리다. 스텍 프레임은 스택 세그먼트 안에 잡힌다.


    스텍프레임을 사용해서 얻는 이점 : 복귀주소(여기서 복귀 주소는 함수 호출 직후의 주소, 즉 다음 주소를 이야기 한다) 전달이 가능해짐. (스택의 크기가 충분하다면), 함수의 인자전달, 

    * 고정된 레지스터나 고정된 메모리 주소에 값을 쓰면 이전값이 사라지니까.


    그리고 복귀 주소를 쌓아둔 메모리(스텍프레임이지..)중 가장 윗부분을 가리키는 레지스터가 SP이다.


    함수내에서는 자동으로 함수가 종료되면 함수내에서 스택세그먼트의 주소를 4바이트 해제한다 그 이유는 스택 포인터 레지스터(4바이트)만큼 증가시켜둔걸 해제하기 위함이다..(함수내라는걸 잊지 말도록..) 그뒤에 함수 호출이 끝난고 난뒤에 나머지 인자 만큼 또 다시 줄이는것임..

    여기서 등장하는 개념이 함수 호출규약이다.


    __cdcel은 함수의 인자는 함수 밖에서 하게 된다. 그래서 약간 코드 사이즈가 더 길다;

    __stdcall에서는 인자의 대한 스택 해지까지 호출된 함수 내부에서 하게 된다. 그래서 함수 호출이 끝난 다음에도 별도의 작업을 할 필요가 없어

    함수의 독립성이 뛰어나다


    둘의 차이가 또 있는데 cdcel은 가변인자 가능 stdcall은 불가능이다 왜냐면..가변인자의 크기를 모르니까..

    (매번 printf를 실행해봐..그러면 함수 내부에서는 도대체얼만큼의 크기인지 모른다는거야..

    왜냐면 printf해서 하나 출력할수도 2개 출력할수도..모르잖어 ..)


    함수의 리턴값은 스택이 아니라 레지스터를 통해 전달이 된다. eax! eax !


    ebp는 esp(스택포인터)레지스터 대신 인자값을 엑서스 하기 위한 사용밖에 없다는..

    push와  pop 어셈블리어


    (ebp : extended base pointer)

    push ebp - 이전 스택의 base주소를 저장

    mov ebp, esp - 현재 스택의 꼭대기를 새로운 스택의 base설정


    지역변수는 sub으로 move ebp esp 다음에 지역변수 만큼 선언됨 ㅋ


    '@ 16. 1 ~ 17. 1 > 면접관련' 카테고리의 다른 글

    빅오표기법이란  (0) 2016.12.04
    메모리 풀  (0) 2016.12.04
    그래프 인접리스트(DFS, BFS)  (0) 2016.12.04
    렌더링 파이프라인 정리  (0) 2016.12.04
    면접관련 정리  (0) 2016.12.04
Designed by Tistory.