본문 바로가기

Language/_Assembly

함수 호출 과정

스택 프레임(Stack Frame) : 함수 호출시 할당되는 메모리 블록(지역변수의 선언으로 인해 할당되는 메모리 블록)


함수 호출이 완료되면(return) 기존에 선언된 지역변수에 접근이 불가능하다.(할당된 메모리가 반환되기 때문)

(ex. fct1() 함수가 호출되면서 함수 내부에 선언된 변수 c, d 가 스택에 할당되는데
      이 메모리 블록을 fct1() 함수의 스택 프레임이라 한다. fct1() 함수가 반환되면 스택 프레임도 반환된다.)



SP 레지스터 : 스택 프레임을 가리키는 레지스터


sp 레지스터 값은 변수가 하나 하나씩 할당될 때마다 증가하면서 다음 변수가 할당될 메모리 위치를 가리킨다.

호출한 함수가 종료될 경우, 스택 프레임 단위로 sp 레지스터 값을 이동시켜야 한다.
(함수 안에서 선언된 변수들을 모두 반환해야 하기 때문에)

(참고 : sp 레지스터값을 아래로 이동시키면 이전에 선언한 변수를 반환할 수 있다.
(새로운 변수 할당시 이전에 저장한 값을을 덮어쓰게될 것이다))



프레임 포인터(Frame Pointer) 레지스터 : 되돌아갈(함수호출 전) sp 위치를 저장 하는 레지스터


함수를 호출하는 과정에서 sp 레지스터에 저장된 값을 fp 레지스터에 저장한다.

함수를 반환하고 나면 fp 에 저장된 값을 참조하여 다시 sp 레지스터에 되돌린다.

즉, 함수 호출 이전 위치를 sp 가 가리키게 된다. (호출한 함수의 스택 프레임이 반환된 셈이다)


함수 호출 시 fp 레지스터에 저장되어 있는 값을 스택에 쌓는다.
(여러 함수를 호출시 fp 레지스터 정보가 덮어씌어저 지우지는 걸 막는다)

sp 레지스터에 저장된 값을 fp 레지스터에 옮기기 전에,

fp 레지스터에 저장된 값을 스택에 쌓아 모든 스택 프레임의 경계 정보를 저장한다.



함수 호출(Procedure Call)에 의한 실행의 이동 :

메모리 구조와 프로그램 카운터(Program Counter) :


Code 영역 : 프로그램이 동작하기 위한 프로그램 코드(컴파일된 명령어들의 집합)가 올라가는 위치

pc 레지스터 : 명령어를 순차적으로 fetch 하기 위해서 명령어 위치를 가리킨다.


IR : 명렁어를 가져오기 위한 레지스터



함수 호출과 함수 종료 :


32비트 명령어 기준으로 pc 는 명령어를 실행할 때마다 4씩 증가한다.

pc 는 함수를 호출하기 전에 현재의 pc 값을 스택에 저장한다.

함수 호출 완료후 스택의 pc 값을 참조하여 되돌아온다.

'Language > _Assembly' 카테고리의 다른 글

어셈블리 디자인을 통한 컴퓨터 구조의 접근  (0) 2010.02.09
스택과 콜링컨벤션의 이해  (0) 2009.10.26
상황별 기초 어셈블리어  (3) 2009.10.26
기초 어셈블리어.  (11) 2009.10.25