Conditional Operation은 if, else, goto, for, while, switch 등의 제어문을 구현하기 위해 사용된다. 대표적으로 beq(if ==), bne (if !=), j(goto)가 있다. 이들은 I format 혹은 J format 명령어들이다.
1. beq (Branch Equal)
- beq는 I format instruction으로 rs와 rt에 있는 값이 같으면 특정 라벨로 이동시킨다.
- beq rs, rt, L1과 같이 표기한다. (L1은 특정 명령어가 포함된 주소공간이 된다)
- 만약 rs와 rt가 다르면 그냥 무시하고 다음 명령어를 실행하게 된다.
// C Code :
if(a == b) {
a = a + b;
}
a = a - b;
// MIPS Code :
main:
beq t0, t1, L1
sub t0, t0, t1
L1:
add t0, t0, t1
2. bne (Branch Not Eqaul)
- bne는 I format instruction으로 rs와 rt의 값이 다르면 특정 라벨로 이동시킨다.
- else를 구현하는데 용이하게 사용될 수 있다.
// C Code :
if (a==b)
a = 3;
else
a = 0;
a += b;
// MIPS Code :
main:
beq t0, t1, L1
bne t0, t1, L2
add t0, t0, t1
L1:
addi t0, zero, 3
L2:
addi t0, zero, 0
3. j (Jump) & J format Instruction
- j는 jump로서 J format Instruction이다. J format Instruction의 구조는 다음과 같다.
- J format의 구조는 매우 간단한데 opcode(jump)와 이동할 주소를 표현할 26비트의 주소필드로 구성된다.
- j L1과 같이 호출하면, L1의 필드로 곧장 분기하여 점프한다.
// C Code :
Label:
a = a + 3;
if (a == b)
goto Label:
else
a = b;
// MIPS Code:
L1:
addi t0, t0, 3
beq t0, t1, Label
bne t0, t1, L2
Label:
j L1
L2:
addi t0, zero, t1
4. Loop Condition (While, For 등)
beq, bne, j를 이용하면 반복문을 구현할 수 있다.
// C Code :
while(s[i] == k)
i ++;
s[i] = k + 4;
// MIPS Code :
// i = t0, k= s0, s = s1
main:
j LOOP // LOOP로 이동
addi t3, s0, 4 // z = k + 4
sw t3, 0(t1) // s[i] = z (t1에 s[i]의 주소가 남아있음)
LOOP :
sll t1, t0, 2 // t1 = i * 4; (offset 만들기)
add t1, t1, s1 // t1 = s + t1; (base + offset)
lw t2, 0(t1) // t2에 s[i] 로드
bne t2, s0, MAIN // s[i]와 k 비교 다르면 main으로 빠져나감
addi t0, t0, 1 // 조건에 맞으면 i++;
j LOOP // 루프 재시작
5. Reference
'컴퓨터구조' 카테고리의 다른 글
명령어 (15) - MIPS 프로그래밍 해보기 (0) | 2020.05.04 |
---|---|
명령어 (14) - 프로시져 / 함수 (1) (1) | 2020.05.01 |
명령어 (13) - 대소 비교 (<) (0) | 2020.04.08 |
명령어 (11) - 논리 연산 (0) | 2020.04.08 |
명령어 (10) - 주소 지정 (0) | 2020.04.08 |
명령어 (9) - I Format (0) | 2020.04.08 |
명령어 (8) - R Format (0) | 2020.04.08 |