jal 은 branch 로 link를 시킨 후에 return adress를 저장한다.
따라서 위와 같은 구조로 만들어 진다.
한편, 레지스터 들은 각각의 별명에 기능이 함축되어 있다.
$zero 는 항상 0 이고, $2 - $3의 별명은 $v0 - $v1 으로 이 의미는 return 결과 같이거나, system call code 이다.
$a0 - $a4 는 arguments 로 함수의 입력값등에 쓰인다.
$t0 - $t7 는 tmp 로 연산을 할 때에 사용한다.
$s0 - $s7 는 저장되는 임시 Register (서브루틴 호출시 저장된다) 함수 호출시 함수 시작부분에서 해당 Register를 Stack에 저장한다.
$t8 - $t9 는 추가적인 레지스터 이다.
$gp 는 global pointer, $sp 는 stack pointer 이다. $fp 는 frame pointer, $ra 는 return address 이다.
위에서의 system call code 의 의미는 syscall 을 수행 시킬때에 해당 코드에 따라 동작을 수행하는 것이다.
함수의 호출 과정 :
위와 같은 코드가 있다고 했을 때에 함수의 arg 는 $a0, $a1, $a2, $a3 에 저장되고, 함수 안의 f는 $s0에 저장되고, arg 들을 계산 하면서 나오는 결과 들은 $t 에 저장된다.
그리고 return 값은 $v0에 저장 된다.
하지만, 이는 해당 함수 안에서의 작동이다. 함수 밖에서 해당 함수를 부를 때에
위와 같이 이미 선언한 변수가 있다면, 이는 함수 안에서 똑같이 쓰이는 레지스터 이기 때문에 sw 를 활용해서 메모리에 저장한 후에 함수가 끝나면 lw 를 활용해서 꺼내온다.
따라서 함수를 실행시킨다면 위와 같이 실행된다.
위의 $sp 에서 -12 를 한 이유는 저장해야할 변수가 3개 이기때문에 하나에 4byte 이기 때문에 4 * 3 = 12로 12를 빼준다.
빼는 이유는 stack에는 거꾸로 채우기 때문에 sp를 줄인다음에 아래서 부터 위로 채운다. 그리고 다 쓴 후에는 $sp에 다시 더해서 원 상태로 만든다.
spim에서의 재귀
'컴퓨터 구조' 카테고리의 다른 글
컴퓨터 구조 (1) | 2022.10.04 |
---|---|
컴구 translation and startup (1) | 2022.09.30 |
컴퓨터 구조(06) (1) | 2022.09.23 |
컴퓨터 구조(05) (0) | 2022.09.20 |
컴퓨터 구조 (04) (0) | 2022.09.16 |