함수 안에서 변수를 선언하면 해당 변수는 레지스터에 저장하기에 용량이 크면 스택에 저장된다. 이때 스택에 저장된 변수는 프로시저 프레임으로 세분화된다.
프로시저 프레임은 프로시저가 호출될 때 생성되고 프로시저가 종료될 때 삭제된다.
프로시저 프레임에는 프로시저가 호출될 때 저장해야하는 값들을 포함한다. 인자 레지스터 $a, 반환주소레지스터 $ra, 저장된 레지스터 $s, 지역변수가 이에 포함된다. 따라서 프로시저 내부에서 변수를 사용하면 해당 변수는 프로시저 프레임 내에 저장된다. 프로시저가 종료될 때 그 프레임이 삭제되고 해당 변수도 함께 삭제된다.
프로시저 프레임을 사용해서 프로시저에서 지역 변수와 레지스터를 관리할 수 있다. 이는 메모리 공간을 효율적으로 활용할 수 있게 해주고 스택을 사용해서 함수 호출과 반환을 간편하게 처리할 수 있게 한다.
Q. 프로시저 프레임은 논리적인 개념인가?
그렇다. 프로시저 프레임이란 프로시저가 실행되는 동안 해당 프로시저에서 사용하는 레지스터와 지역 변수들을 저장하는 공간을 가리키는 개념이다. 프로시저가 종료될 때 해당 프로시저에 대한 레지스터와 지역 변수들은 스택에서 제거되기에 프로시저 프레임도 스택에서 제거되는 것이다. 따라서 프로시저 프레임은 함수에서 사용되는 레지스터와 지역 변수들을 저장하기 위해 할당되는 논리적인 메모리 공간이라 생각할 수 있다.
함수 프레임 내에서 특정 데이터를 찾는 것은 스택포인터인 $sp를 사용해서 찾을 수 있었다. 하지만 함수 실행 중에 $sp는 계속 변화하기에 프레임 내에서 데이터를 찾는 것이 어렵다.
따라서 MIPS는 프레임포인터, $fp를 제공한다. 이는 프로시저 내에서 안정적인 베이스 레지스터로 사용되고 따라서 프로시저 프레임 내에서 데이터를 찾는 것이 더욱 쉬워진다. 다만 프로시저가 호출되거나 반환될 때마다 $sp와 마찬가지로 $fp도 조정되어야 한다. 따라서 프로시저가 시작되거나 종료될 때 $fp와 $sp를 조정해서 스택의 무결성을 유지해야 한다.
MIPS에서 메모리 공간은 4가지 영역으로 나뉜다. - 스택, 힙, 정적 데이터 세그먼트, 텍스트 세그먼트
텍스트 세그먼트는 MIPS 머신 코드를 저장하는 영역이다. 프로그램이 실행될 때 코드는 이 영역에 저장된다. 또 현재 실행 중인 명령어를 나타내는 PC도 이 영역에서 관리된다.
정적 데이터 세그먼트는 상수와 정적 변수를 저장하는 영역이다. C에서 프로시저 밖에서 선언된 전역변수, static 변수로 선언된 변수가 해당된다. 이 영역의 데이터에 접근하기 위해 글로벌포인터 $gp가 제공된다.
힙은 동적으로 생성되는 데이터 구조체를 저장하는 영역이다.
스택은 프로시저가 호출될 때 생성되는 지역 변수를 저장하는 영역이다. $sp는 스택에서 가장 최근에 저장된 데이터를 가리키고 스택 포인터를 조정해서 데이터를 스택에 추가하거나 삭제한다.
스택과 힙은 서로 반대 방향으로 성장하고, 중간지점을 넘어가지 않도록 주의해야한다.
지금까지 다룬 레지스터이다.
여기 표에 없는 1번 레지스터는 어셈블리어 명령어를 생성하고 실행하는데 사용되고, 26,27번은 운영체제에서 사용되는 예약 레지스터로 일반적으로 사용자 프로그램에서 직접적으로 접근해서 사용하지 않는다.
'학교강의필기장 > 컴퓨터구조' 카테고리의 다른 글
컴퓨터구조[9]: MIPS 구조 요약 (0) | 2023.04.09 |
---|---|
컴퓨터구조[8]: address mode - PC-relative / Pseudo-direct (0) | 2023.04.09 |
컴퓨터구조[6]: 함수(프로시저)와 스택 포인터 2 - 재귀함수에서의 어셈블리 (0) | 2023.04.09 |
컴퓨터구조[5] : 함수(프로시저)와 스택 포인터 1 (0) | 2023.04.09 |
컴퓨터구조[4] : shift 연산과 조건문, 반복문 (0) | 2023.04.06 |