본문 바로가기

학교공부/컴퓨터구조

컴퓨터구조 MIPS - 2

MIPS Register 역할이 나눠져있다

 

 

Procedures


절차적으로 함수나 인터렙트 콜이 진행될라면 register들의 값이 유지되어야됨

따라서 함수콜와서 딴데가도 지금하던거(레지스터)를 다른데다 잘 저장해 놔야한다.

딴 데 갈 때는 빈 레지스터를 준다.

 

이 작업을 수행하기 위해서 저번시간에 적은 JAL을 사용한다

Jump-and-Link로 31번 레지스터에 address counting하는 방식으로 진행된다.

함수콜오면 $ra에 current PC(actually PC+4)를 넣고 다시 돌아올 때 쓴다.

 

그럼 요것들을 어디 저장해놓냐? stack memory에 차곡차곡 쌓아논다.

Proc A에서 B로갈때 A의 레지스터들 다 stack 형태로 메모리에 넣어놓고 빈상태의 레지스터를 Proc B에 준다. 정확히말하면 다빈 건아니지만 대충 비어있는거임.

 

그럼 절차를 보자

1. 먼저 procedure가 생기면 얘는 지꺼 저장할 stack 공간을 미리 확보해논다.

2. 함수콜이든 뭐든와서 jal이 실행될거같으면 stack space에 레지스터 값들 저장함.

3. 콜할때 넘겨주고 싶은 argument는 $a~a3 여따가 저장해서 넘겨줌.

4. stack에도 data 쌓였으니까 sp도 갱신해준다.

5. callee가 할일 다 끝났으면 return value는 $v0에 넣고 stack space비우고 $sp 증가시킴(stack은 high -> low니까 비웠으면 올려줘야됨)

6. stack에 있는걸 다시 register로 옮김.

 

caller와 callee의 입장에서 저장

예시


1~4 라인 : 자 먼저 sp -12 즉 12만큼의 stack space를 확보한다음 현재 register의 값을 넣는다. (sw는 register -> memory lw는 memory -> register임)

 

5~7 라인 : 그다음 비어있는 $s와 $t를 이용해서 연산함 ( $a는 argument임)

8 라인 : 연산한 결과를 %v0에 저장 (return value 저장하는 register)

9~ 라인 : 다했으니까 stack space에 있는 값 다시 register에 올려놓고 sp 증가시키고 이전 caller가 주었던 $ra 통해서 전으로 돌아간다.

 

 

예시2


우리가 흔히 만드는 재귀형식의 factorial 함수이다.

fact(3)을 넣었다고 생각하면

 

이렇게 실행된다.  slti는 a0 < 1 이라면 t0에 1을 넣는 명령어이다. 따라서 n = 0까지 이동해서 return 1이 실행되고

순서대로 위의 procedure로 이동해 v0 = v0 * a0  이전의 fact 연산값과 현재의 n을 연산해서 return 값으로 넘겨준다.

 

'학교공부 > 컴퓨터구조' 카테고리의 다른 글

컴퓨터구조 9 - Pipeline  (0) 2020.06.15
컴퓨터구조 SingleCycle  (0) 2020.06.15
컴퓨터구조 MIPS  (0) 2020.06.14
컴퓨터구조 Performance  (0) 2020.06.14
컴퓨터구조 20 - Memory Hierarchy  (0) 2020.05.28