이번엔 conditional branch instruction(분기문)을 알아보자!
branch instruction은 조건을 보고, 특정 statement로 간다고 생각하면된다. 예를들어, 반복문 안에
if(a==1) {
break;
}
이라는 조건문이 있다면, a와 1을 비교해서 같을 경우(a - 1==0 이면) 반복문 밖의 line(특정 statement)으로 가게 될것이다. 사용되는 instruction들을 알아보자.
beq(branch if equeal)
-beq r1, r2, L1 에서, r1-r2==0인경우 L1으로 branch
bne(branch if not equal)
-bne r1, r2, L1 에서, r1-r2!=0인 경우 L1으로 branch
아래는 분기문과 함께 자주 쓰이는 대소비교를 위한 instruction이다.
※unsigned comparision일 경우 sltu,sltiu를 사용
이제 예제를 보며 복습해보자.
while(save[i]==k)
i+=1;
을 MIPS로 나타내면,
가 된다. Loop와 Exit은 MIPS에서 반복문을 표현하는 방법이고,
j는 특정 statement로 가는 jump instruction인데, R-format도 I-format도 아닌
J-format이다. 후에 다시 다룰 예정이다.
여기선 MIPS의 register들을 총정리해보고, 덧붙여 procedure를 왔다갔다 하기위한 instruction을 알아볼것이다. 지금까지 많은 종류의 register들이 나왔는데, 이번 기회에 머릿속에 잘 정리해두자!
그리고 procedure이동을 위한 instruction 이다.
이제 위에서 넘어갔던 $sp, $fp를 알아보자. 이를 위해 stack뿐만 아니라 메모리의 전체적인 구조를 알아볼건데, 너무너무 중요한 부분이니 반!드!시! 잘 이해하자.
먼저 메모리 구조를 4가지로 나눠보자.
우리가 주의 깊게 다뤄볼 것은 stack이다.
saved register나 함수의 argument의 경우 함수내에 또 다른 함수가 호출될 경우 그 값이 덮여 쓰일텐데, 그러면 원래의 값을 어떻게 기억할까? 바로 Stack에 저장해두고 그 함수가 종료되면 다시 값을 복원하는 것이다!
$fp : stack의 첫번째 item위치를 가리키는 pointer
$sp : stack의 현재 item위치를 가리키는 pointer
그림과 같이 stack은 값이 추가될 때 high address에서 low address로, 즉 위에서 아래로 그 크기가 자란다. 이번에도 역시 예시를 보도록하자!
위 MIPS 코드는 Function1안에 Function2가 있는 nested procedure이다.
F1이 끝난뒤의 return address와 argument register를 기억해주기 위해 stack pointer를 -8만큼(alignment restriction) 옮겨 2개의 공간을 만들고, sw 명령어로 $a0과 $ra를 저장한 것을 볼 수있다. 그리고 F2 이 끝난뒤 lw를 통해 그 값들을 다시 가져온것을 확인할 수 있다.