SP(stack pointer) 레지스터
-스택에 데이터를 쌓거나 반환하기위해서는 내가 현재 어디까지 썼는가,즉 얼마나 스택을 쌓았는가를 알기위한 데이터가필요하다.
sp레지스터는 다음 스택을 쌓아야하는 위치주소를 가지고있다.
fp(frame pointer) 레지스터
-함수가 끝난뒤 반환될때 어디로 반환되어야 하는지 되돌아갈 위치를 알아야한다.
fp에는 현재함수가끝난뒤에 반환될 위치주소가 저장되어있다.
위의 그림에서 보면 fct2 반환후 sp의 위치가 fct2 호출전으로 바뀌어 덮어씌우게(fct2의 지역변수가 먹었던 자원(메모리)을 사용할수있게) 만들어야한다.
하지만 되돌아갈 위치주소를 모르기때문에 fp에 반환될 위치주소가 저장되어 있는것이다.
!!! 이것만 가지고될까?
문제는 함수안에서 또함수를 부를때 발생한다.
fct1에 들어가서 fp에는 8이라는 반환될주소가 저장되있고 sp는 스택을 쌓아올리고있다.
이때 함수 fct2가불린다면,
fct2의 돌아갈위치 16을 fp에 저장하고(8이라는 정보가 날라감!!) sp는 스택을또 쌓아올릴 것이다.
이제 함수가 반환되는 과정을 보자.
fp에 저장된 반환주소로 sp를 옮긴다.
이제 fct1을 반환시켜야하는데 8이라는 값은 아까 덮여쓰여져 없어져버렸다.
우리는 함수호출이 될때 되돌아갈 주소를 fp에 저장해두었는데 이게 한개만 저장했더니 안되는것이다.
문제해결
스택을 이용한다.
--함수 호출될때
-sp가 8일때 함수가 호출되면 그스택(메모리)에 fp값 0을 저장해둔다.
저장하는것은 1스택을 더하기때문에 sp는 12가된다.
fp에는 sp - 4 (fp가 32bit라고가정)값을 저장한다.
PUSH fp
ADD fp, sp, -4
PUSH명령어 ? :스택에 피연산자를 저장한다.
알고리즘 - sp위치에 피연산자를 저장한다. sp값을 그피연산자 데이터 크기만큼 증가시킨다.
정의된 명령어를 통해 구현할수 있다. ADD,STORE,indirect 등...을 이용하면 된다.
--함수 반환될때
-sp를 fp위치로 이동시키고 fp값을 sp위치의 데이터값으로 변경한다.
sp와 fp의변화과정
sp | fp |
|
fct2반환전 |
32 |
20 |
fct2반환 |
20 |
8 |
fc1반환 |
8 |
0 |
'Operating System & Computer Architecture > 윈도우즈 시스템 프로그래밍' 카테고리의 다른 글
컴퓨터 구조 - (4) 주소 지정방식 (0) | 2018.02.01 |
---|---|
컴퓨터구조 - (3) LOAD & STORE 명령어 디자인 (0) | 2018.02.01 |
컴퓨터구조 -(2) 레지스터 (0) | 2018.02.01 |
컴퓨터구조 - (1) (0) | 2018.02.01 |