Conditional Branches
- 실행 순서를 바꾸는 instructions
- beq : Branch if equal
- beq r1, r2, L1
- r1과 r2에 저장된 value가 같으면 L1으로 label된 statement로 이동한다.
- MIPS assembly programming language(assembly language)인 경우 L1은 ASCII code, MIPS binary machine language인 경우 L1은 memory address에 대응한다.
- 무슨 말이냐면, L1은 assembly language에서 어떤 한 시점의 이름이고, 이게 assembler에 의해 binary machine language로 변환된 후에는 memory address가 된다는 뜻. 사람이 알아볼 수 있게 L1으로 표현하지만, assembler를 거친 후 저 L1이라는 지점은 메모리의 한 위치로 대응된다는 뜻이다.
- 아래 그림에서 Else, Exit따위가 L1이 될 수 있다.
- bne : Branch if not equal
- bne r1, r2, L1
- r1과 r2에 저장된 value가 다르면 L1으로 label된 statement로 이동한다.
예시
Loops
- beq, bne를 통해 loop 탈출 등을 결정할 수 있다. 근데 loop은 대소관계 비교같은 것도 필요한 경우가 많다.
- slt : Set on less than
- slt rd, rs, rt
- R-type이지만, rd에 source register의 값을 연산한 결과가 아니라, rs, rt의 대소관계 결과가 저장된다.
- set rd = 1 if rs < rt, rd = 0 if rs ≥ rt
- slti : An immediate viersion of slt
- slti rd, rs, const
- set rd = 1 if rs < const, rd = 0 if rs ≥ const
Case/Switch Statements
- Indirect branches 구현으로 해결! 아래는 high level description이다.
- target address를 branch(address) table에 저장한다
- Switch문에 들어오는 val을 확인한다. if, else 논리를 사용해 계속 비교하다가 제대로 대응하는 경우가 발생하면, target address를 branch table에서 register로 load한다
- jump register(jr) instruction을 사용해 target address로 뛰어넘는다!
Supporting Procedures/Functions
Function이 실행되면, 수행해야하는 로직들이 해당 function 내부의 것들로 모두 바뀌고, 또 input이 요구되는 경우 data도 가져가야 하고, 또 함수가 종료되면 원래 위치로 돌아와야하며 return하는 값이 있으면 그것도 가져와야한다. 따라서 hw 입장에서 생각해보면 function을 실행하기 꽤 어렵다.