컴퓨터 구조

[컴퓨터 구조] - 4. Procedure

dietken1 2024. 11. 1. 14:20
반응형

[Jump 명령어]
1. jal : (SIC의 JSUB이라고 생각하면 됨)
- " jal func " 의 형식으로 사용
- PC+4값을 $ra에 저장하고, func로 점프함.
2. jr : (SIC의 RSUB이라고 생각하면 됨)
- " jr $ra " 의 형식으로 사용
- $ra에 저장된 주소로 이동(=복귀)

 


[레지스터 역할]
- $a0~$a3 : Arguments
- $v0~$v1 : Results (함수의 반환 값 저장용도)

 


[Caller save 레지스터]
- $t0~$t9 레지스터
- 반드시 값을 보존할 필요 없음 (일종의 약속임)
- 다른 함수로 갔다왔을때 그 값이 보장이 되지 않음.
- 만약 그 값을 유지하고싶으면 함수 호출전에 메모리에 sw로 저장했다가 함수가 끝나고 돌아와서 lw로 다시 불러와야함

 


[Callee save 레지스터]
- $s0~$s7 레지스터
- 반드시 값을 보존해야함 (일종의 약속임)
- 함수 호출전에 sw로 메모리에 저장하고, 호출된 함수에서 마지막에 lw로 복원을 해준 뒤에 반환해야함.

 


[프로그램의 메모리 Layout]

1. Code : 프로그램의 코드가 저장된다 ($pc는 현재 실행중인 코드의 주소를 나타냄)
2. Data : Global variables (=전역변수) ($gp)
3. Heap : 동적 할당 (굳이 알필요X)
4. Stack : Local values가 저장된다 ($fp는 현재 실행중인 스택의 베이스를 가리키고, $sp는 스택의 Top을 가리킨다.)

 


[Stack Frame]
- $fp와 $sp로 지정되는 스택 공간을 의미함
- ex) 만약 100바이트 만큼의 공간을 할당하고 싶다면, $sp에 100바이트만큼 빼주고, $fp에 기존 $sp값을 넣어주면 된다. (아래로 갈수록 High address이기 때문에 빼주는 것임)
- Stack Frame에 저장되는것들 :

  1. Local arrays and structures
  2. Saved registers
  3. saved return address
  4. saved argument registers


[Handling Procedure Calls]
- 1st pass : 코드 생성 및 데이터 저장(빈칸이 많음)
- 2nd pass : 빈칸을 채움 (Stack크기, Label, 함수)
- argument 레지스터는 Caller 레지스터이다.
- $ra 레지스터는 Callee 레지스터이다. (호출된 함수에서 또 다른 함수를 호출하면 덮어쓰기가 되어버리기 때문)

 


[프롤로그]
- argument 전부저장, ra 저장 (항상 형태는 유사하다고 보면됨)
add sp sp -12 (argument가 2개고, ra가 하나 있으므로 4*2 + 4 = 12)
sw a0 0(sp)
sw a1 4(sp)
sw ra 8(sp)

 


[에필로그]
- ra 복원, stack 복원, jr명령어로 ra로 돌아가기 (항상 형태는 유사하다고 보면됨)
 lw   ra  8(sp)
addi sp sp +12
  jr   ra

 

※ 함수를 갔다와서 argument를 쓰려면 복원을 해야함

반응형