본문 바로가기

General/OS & CS

[컴퓨터 구조] 프로시저 procedure / 함수 fuction

프로시저 procedure / 함수 fuction

 

프로시저 실행 6단계

1. callee가 parameter를 인자값을 저장할 저장공간에 copy(callee가 접근가능한 저장공간에)

2. 제어(control)를 caller(프로그램)에게서 callee가 넘겨받음

3. callee가 필요로하는 자원 저장공간 획득

4. callee가 작업(task)를 수행

5. caller가 접근가능한 공간에, callee가 result를 저장

6. 제어(control)을 caller에게 되돌려줌

 

processor가 명령어를 실행하는 순서

예를 들어 100번 메모리번지에서 부터 명령어를 실행해서 내려간다고 하자.

그럼 processor는 100번지에 있는 명령어를 fetch해서 가져올 것이다.

이때 100번지에서 fetch하며 명령어를 가져오는 동시에

자신이 가지고 있는 주소값(100번지)를 4번지 증가시키는 일을 한다.

이는 가져온 명령어를 실행하는 동안 다음 메모리에서 명령어를 가져오기 위함이다.

100번지의 명령어를 실행하고(동시에 104번지의 명령어를 가져오고),

104번지의 명령어를 가져와서(동시에 가지고 있는 주소값을 108번지로 바꾸고),

104번지의 명령어를 실행하고(동시에 108번지의 명령어를 가져오고)

108번지의 명령어를 실행하려고 하는데, 함수호출을 일어나면??!!

 

fuction, procedure가 나타나서 200번지부터의 메모리에있는 명령어를 실행해야 한다면,

108번지는 특별히 주어진 register $ra에 저장해 놓고, ( jal 명령어를 사용 )

200번지로 점프한다. 200번지부터 수행해야될 일이 끝나면,

주어진 무조건 점프 명령어 jr 을 통해 $ra에 있는 주소로 돌아오게 된다.

 

: j instruction은 뒤에 상수가 와야하므로 새로운 명령어 jr 이 나오게 된다.

  jr은 jump on register 라고 해야될까나... 암튼 기능은 $ra 레지스터에 있는 번지로 점프

 

정해진 register들에 대해선 다시 정리할 계획이다.

 

: 프로그램은 명령어의 나열이다. 명령어들을 순서대로 나열하고, 순서대로 불러서 실행시킬 뿐이다.

 

 

Stack 메모리

MIPS는 메모리를 효율적으로 사용하기 위해 data structure를 구성한다.

바로 stack data structure를 사용하는 것이다.

stack은 간단하게 말해 후입선출(Last-Input, First-Out : LIFO)방식의 자료구조형이다.

 

stack은 두개의 연산(push와 pop)과 하나의 포인터(stack pointer)를 필요로 한다.

(pointer는 여기서 register로 사용되겠지?, 물론 push와 pop도 sw와 lw로 사용하고)

 

 0
 4
 8
 ..
 ..
 ..
 ..
 (기준-12)
 (기준-8)
 (기준-4)

                                                    (기준)        <- sp

 

실제로 MIPS는 메모리에 byte addressing을 사용하지만,

기본단위가 word(4bytes)인 만큼 편의상 메모리 크기를 4bytes로 표현하였다.

 

메모리의 구조가 위와 같다면 sp(stack pointer)는 stack으로 사용하려 정해진 메모리공간의,

한칸 밑의 메모리공간을 가리키고 있는다.

즉, 데이터나 주소값등을 넣을때 마다 번지수가 커지는것이 아니라 작아진다는 말이다.

 

위의 메모리(1차원 배열형식의)를 보면 알겠지만, 저렇게 표현된다는 것은!!!!

lw와 sw를 사용해서 메모리에 접근하겠다는 의미이다 ^^