# Procedure Call in MIPS
* 모든 MIPS instruction은 32bit(=4byte)로 크기가 균일
† procedure : 특정 작업을 수행하기 위한 여러 연산의 묶음 ( =함수)
+ 호출 이후에도 값이 유지되어야 하는 registe의 저장
+ return address의 저장
+ argument의 전달
in MIPS, 레지스터의 각 칸은 나름의 각자 역할이 있다.
* 0번째 칸은 항상 0만 저장한다
* A함수가 작업하다가 B함수를 호출할 때,
A는 이미 레지스터를 맵핑을 하여 사용하고 있었을 것이다.
하지만 B도 레지스터에 맵핑해서 사용하고 싶을 것이다. 더 빠르니까
근데 B가 맵핑해버리면 A함수가 사용하던 데이터가 B에 덮여서 사라져버린다.
따라서 A가 사용하던 데이터(레지스터 값)를 다른 곳에 저장하고
B가 레지스터를 자유롭게 쓰다가 B가 리턴되고나면
다시 다른 곳에 저장됬던 A의 값을 복원하는 과정이 필요하다.
이 A의 값은 stack에 저장한다.
근데 만약 어떤 함수가 변수를 하나만 사용하고 있다면
이 레지스터 값을 다 옮길 필요는 없다.
즉, 예를 들어 B가 호출됬는데 A가 일반 지역변수 1개만 사용한다!
이럴때는 굳이 A가 쓰던 값을 stack으로 옮길 필요가 없다
(쓰고 싶은 레지스터값만 저장하면 되지 A에 대한 모든 값을 stack에 옮길 필요는 없다.)
* ex) 함수 A가 B를 call 할 때,
A에 대한 레지스터의 값들이 B에 대한 값들로 덮일 것이기 때문에 A에 대한 값을 미리 stack에 저장해 놓아야 한다.
▼▽▼stack에 저장하는 방법은 여러가지가 있다.▽▼▽
(temporary) t0-t9 : 함수를 호출하는 쪽에서 저장해야할 의무가 있음
A가 B를 호출할 때 A는 자기가 쓰던 레지스터가 B에게 밀릴거라 생각해서
자기(A) stack에 미리 저장해놓아야 한다는 것
(saved) s0-s7 : 저장의 책임이 호출되는 쪽에 있다
B가 A의 데이터를 자기(B) stack에 저장시켰다가 본인이 리턴될 때
다시 A의 값을 복원시켜놓고 간다
(같은 말 한번 더 정리)
==================================
* 함수 (연산) 이 2개 이상 존재할 때, 레지스터는 항상 값을 덮어쓰기 때문에 2개 이상의 값을 저장하지 못한다.
따라서 함수가 호출될 때마다 stack에 return address (stack의 주소)를 추가적으로 저장하여 호출한 함수의 일이 끝나면 원래 함수의 값들을 다시 불러와 필요한 일을 한다.
(기본적으로 함수 호출은 stack이 관리하지만 레지스터에 여유가 있다면 레지스터를 사용한다.)
Stack? :
'about COMPUTER > 컴퓨터 시스템' 카테고리의 다른 글
# 05. 운영체제 OS (0) | 2020.10.15 |
---|---|
# 04. 프로그램 컴파일 과정 (고급언어가 실행되기 까지) (0) | 2020.10.15 |
# 02. MIPS의 ISA (0) | 2020.10.09 |
# 01. Instruction + ISA (Instruction Set Architecture) (0) | 2020.10.09 |
# 00. 컴퓨터 시스템 (0) | 2020.10.09 |
댓글