1. Procedure(함수) 실행의 6단계
- 메인 루틴(Caller)은 함수(Callee)가 엑세스할 수 있는 $a(0~3)레지스터에 파라미터를 저장함
- Caller가 Callee에게 제어권을 넘김 (jal procedure)
- Callee가 필요한 메모리 공간을 프로세서로부터 할당받음 (sp를 이용해 스택프레임 생성)
- Callee가 요구되는 작업을 수행함
- Callee는 Caller가 엑세스할 수 있는 $v(0~1)레지스터에 리턴값을 저장함
- Callee는 v레지스터에 저장된 값을 $ra(리턴 어드레스)로 넘기고 제어권이 Caller에게 넘어감 (jr ra)
(Return Address는 다음 명령어의 주소를 말함)
2. Procedure Call : jump and link (jal)
jal ProcedureLabel
- jal 명령어는 두가지 작업을 한번에 진행함
- 1) 함수 호출 이후에 실행될 명령어의 주소를 $ra에 넣음
- 2) 해당 타겟 레이블이 있는 곳으로 점프함
3. Prodecure Return : jump register (jr)
jr $ra
- jr 명령어는 레지스터 하나를 받는데, 해당 레지스터에 저장된 주소 값으로 점프함
- 즉, jr명령어를 쓰면 ra레지스터의 값을 pc(프로그램 카운터)라는 레지스터에 복사함
- 프로그램 카운터에는 실행중인 명령어의 메모리주소가 담겨있음 (code/text 영역)
- jal명령어를 통해 Caller에서 Callee호출 이후 작업의 주소를 $ra에 넣어 놨기 때문에,
- $ra로 점프하면 함수 호출 이후의 작업들로 이어나갈 수 있는 것임
- jr 명령어는 함수 리턴 이외에도 case/switch 문 등의 조건문에서도 역시 활용될 수 있음
4, Leaf Procedure Example
// C Code :
int leaf_example(int g, h, i, j){ // g ~ i <= a0 ~ a3
int f; // f <= s0
f = (g + h) - (i + j);
return f; // return <= v0
}
// MIPS Code :
main:
... 생략...
jal leaf_example // leaf_example로 점프하면서 다음 줄에 있는
... 생략 ... // 명령어 주소를 ra 레지스터에 넣음
leaf_example:
/* int f 할당 */
addi $sp $sp -4 // stack을 아래로 4칸 내림 (할당한것임, 스택은 아래로 내려감)
sw $s1 0($sp) // 해당된 스택포인터(메모리) 주소에 있던 값을 s0에 저장함
/* f = (g + h) - (i + j) 연산 */
add $t0 $a0 $a1 // t0 = g + h
add $t1 $a2 $a3 // t1 = i + j
sub $s1 $t0 $t1 // f = t0 - t1
/* return f */
add $v0 $s1 $zero // mov v0 <= s0
/* int f 반환 */
lw $s1 0($sp) // s0의 값을 스택포인터의 주소에 있는 메모리에 저장함 (값이 바뀜)
addi $sp $sp 4 // stack을 위로 4칸 올림 (반환한 것임, 스택은 아래로 내려감)
/* end of leaf_example() */
jr $ra // 다음 실행 주소로 넘어감
- 한 함수에서 다른 함수를 호출하지 않는 함수를 leaf procedure라고 함
- 여기에서 새로 눈여겨 볼 것은 변수를 할당하고, 반환하는 과정까지 포함되었음
- 이전 포스팅 들에서는 그냥 "변수f가 s0에 맵핑되어있다" 이런식으로 표현했는데
- 사실 addi로 스택포인터를 필요한 바이트만큼 내리고, 그 그 값을 저장하여 할당하고,
- 다시 addi로 해당 바이트 만큼 올리고 그 값을 메모리에 쓰는 과정까지 매우 자세히 나와있음
- 마지막에는 jr명령어를 통해 이전에 jal할 때 넣어둔 ra의 명령어주소로 넘어가면서 끝남
5. Reference
'컴퓨터구조' 카테고리의 다른 글
명령어 (17) - MIPS의 주소 지정 (0) | 2020.05.05 |
---|---|
명령어 (16) - 프로시져 / 함수 (2) (0) | 2020.05.04 |
명령어 (15) - MIPS 프로그래밍 해보기 (0) | 2020.05.04 |
명령어 (13) - 대소 비교 (<) (0) | 2020.04.08 |
명령어 (12) - 조건 연산, J Format (0) | 2020.04.08 |
명령어 (11) - 논리 연산 (0) | 2020.04.08 |
명령어 (10) - 주소 지정 (0) | 2020.04.08 |