본문 바로가기

윈도우즈 시스템 프로그래밍

컴퓨터 구조 - 3

* 스택 프레임 구조


- 함수 호출 과정에서 할당되는 메모리 블록 (지역변수의 선언으로 인해 할달되는 메모리 블록) 을 가리켜 스택 프레임이라 한다.


- 함수 호출이 완료되면 기존에 선언된 지역변수에 접근이 불가능하다. 이는 할당되었던 메모리가 반환되었음을 의미하는 것이다.


* sp(스택 포인터) 레지스터


- 스택의 메모리 구조적 특성이 LIFO ( Last In, First Out), 가장 먼저 할당되면 가장 나중에 반환된다 또는 가장 나중에 할당되면 가장 먼저 반환된다 -라는 특성이다.


- 계속해서 스텍에 데이터를 쌓거나 반환하기 위해서는 현재 어느 위치까지 데이터를 저장했는지 기억해야 한다. => 쌓아 올린 스택 위치를 기억해야한다는 뜻이다. CPU 내에 sp(stack pointer)라는 이름의 레지스터가 존재한다. 이녀석이 그 역할을 한다.



※ 그런데 여기서 문제가 발생한다. 호출이 완료된 함수는 빠져 나오는 시점에서, 함수 내에서 할당된 메모리 공간을 반환하기 위해 스택 프레임 단위로 sp를 아래로 이동시킬 때 문제가 된다. 얼마만큼 sp를 이동시켜야 할지 알 수 없기 때문이다. 


=> 해결 방법 : 프레임 포인터


*fp(프레임 포인터) 레지스터


-프레임 포인터는 변수가 선언될 때마다 그 크기만큼 값을 증가시킨다. 


※그러나 여기서 또 문제가 발생한다. 프레임 포인터는 그러면 어디에다가 저장해야 되는 것인가?

=> 해결 방법: 스택에다가 저장하면 된다.


*프레임 포인터를 스택에 저장하자


- 함수 호출이 일어날 때마다 fp 레지스터에 저장되어 있는 값을 스택에 저장하고. 새로운 값으로 fp 레지스터를 채운다.


(자세한 그림은 윈도우즈 시스템 프로그래밍 책 328~329쪽)


* 함수 호출 인자의 전달과 PUSH & POP 명령어 디자인


- 입력에 대한 출력이 반환값으로 존재하면 함수 호출이라 하고, 출력에 해당하는 반환 값 없이 모듈화해 놓은 서브 루틴의 실행을 위한 호출을 가리켜 프로시저 호출이라 한다.


※ 모듈화 : 기능별로 불리해 놓은 것


* 함수 호출 인자의 전달방식


- 함수 호출 시 전달되는 인자를 어디에다 둘 것이냐에 대한 해답도 CPU마다, 혹은 CPU를 제조한 제조사의 표준에 따라 달라진다. 


- 그러나 모든 전달인자들이 반드시 스택에 할당되는 것은 아니다. 성능 향상을 위해서 일부 전달인자들은 레지스터를 할당해서 이곳에 저장하도록 제품의 표준을 정의하기도 한다.


- 함수 호출 시 전달되는 인자들은 모두 스택에 저장하자


- 호출된 함수 내부에서 선언되는 지역변수 이외에도, 호출 시 전달되는 인자값과 스택 프레임의 경꼐 정보까지 스택에 저장되는 구조라고 말할 수 있다.


*PUSH & POP 명령어 디자인


- PUSH 기능 : 현재 sp 값을 참조해서 해당 위치에 데이터를 저장하고 sp의 값 또한 자동으로 증가하는 명령어이다.


- POP 기능 : 스택에 가장 마지막에 들어간 데이터를 꺼낸다. => 꺼낸다는 것은 메모리에서 삭제함을 의미한다.


* 프로그램 카운터 (pc)


※ 명령어의 길이가 4바이트라고 가정하고 실행 중인 프로그램이 현재 1036번지에 있는 명령어라면. 다음 번에는 1040번지에 있는 명령어가 Fetch되어야 한다. 여기서 문제가 발생하는데, 어느 위치에 있는 명령어까지 가져와 실행했는지 기억하고 있어야만 다음 번에 실행할 명령어를 가져올 수 있다.


- 명령어를 순차적으로 Fetch 하기 위해서 프로그램 카운터라 불리는 "pc 레지스터"를 둔다.


※ CPU가 자동적으로 pc값을 조절하지만 필요에 따라서는 프로그램상에서 pc값을 직접 조절해야만 하는 경우도 발생을 한다.


* 함수 호출규약


- 함수 호출규약이란?

=> 함수 호출 시 인자를 전달하는 방식과 스택 프레임을 반환하는 방식을 약속해 놓은 것을 가리켜 함수 호출규약이라 부른다.


※ 64비트 CPU는 32비트 CPU와 다른 레지스터 구조를 지닌다. 따라서 3비트 환경과는 다른 함수 호출 규약이 존재한다.


(자세한 내용은 구글에 검색!!!)



'윈도우즈 시스템 프로그래밍' 카테고리의 다른 글

컴퓨터 구조 - 4  (0) 2016.08.08
컴퓨터 구조 -2  (1) 2016.08.08
컴퓨터 구조 - 1  (1) 2016.08.07