조건부 연산자
- 조건이 참인 경우 레이블이 지정된 명령어로 분기
- 그렇지 않은 경우 순차적으로 계속 진행
beq rs, rt, L1
- if (rs == rt)이면 L1으로 분기
bne rs, rt, L1
- if (rs != rt)이면 L1으로 분기
j L1
- L1으로 무조건 점프
If 문
- C 코드
if (i==j)
f = g+h;
else
f = g-h;
- f : $s0
- g : $s1
- h : $s2
- i :$s3
- j : $s4
- MIPS 코드
bne $s3, $s4, Else
add $s0, $s1, $s2
j Exit
Else:
sub $s0, $s1, $s2
Exit: ...
While 문
- C 코드
while (save[i] == k)
i += 1;
- i : $s3
- k : $s5
- save 주소 : $s6
- MIPS 코드
Loop:
sll $t1, $s3, 2 # $t1 = i * 4
add $t1, $t1, $s6 # $t1 = save 주소(&save[i])
lw $t0, 0($t1) # $t0 = save 주소의 값(save[i])
bne $t0, $s5, Exit
addi $s3, $s3, 1
j Loop
Exit: ...
베이직 블록
- 베이직 블록은 다음과 같은 일련의 명령
- 내장된 분기 없음(끝 부분 제외) = 마지막 빼고는 브랜치가 있으면 안됨
- 분기 대상 없음(시작 시 제외)
- 컴파일러는 최적화를 위한 베이직 블록을 식별
- 고급 프로세서는 베이직 블록의 실행을 가속화
더 많은 조건부 연산
- 조건이 참이면 결과를 1로 설정
slt rd, rs, rt # set less than
- if (rs < rt)이면 rd는 1, 그렇지 않으면 rd는 0
slti rt, rs, constant
- if (rs < constant )이면 rt는 1, 그렇지 않으면 rt는 0
- beq, bne와 함께 사용
slt $t0, $s1, $s2 # if ($s1 < $s2)
bne $t0, $zero, L # L로 분기
- < 외에 >, ≤, ≥은 쓰지 않는다.
- =, ≠보다 <, ≥가 하드웨어에서 느리다.
- 따라서 모든 명령어에 불이익이 생긴다.
Signed vs. Unsigned
- Signed : slt, slti
- Unsigned : sltu, sltui
$s0 = 1111 1111 1111 1111 1111 1111 1111 1111
$s1 = 0000 0000 0000 0000 0000 0000 0000 0001
slt $t0, $s0, $s1 # signed
sltu $t1, $s0, $s1 # unsigned
- $t0 = 1
- $s0 = -1
- $s1 = +1
- –1 < +1는 참
- $t1 = 0
- $s0 = +4,294,967,295
- $s1 = +1
- +4,294,967,295 < +1는 거짓
'컴퓨터시스템구조' 카테고리의 다른 글
[컴퓨터시스템구조] 10. MIPS 문자열 연산자(lb, lh, sb, sh) (0) | 2023.10.14 |
---|---|
[컴퓨터시스템구조] 09. MIPS 프로시저 호출(jal, jr) (1) | 2023.10.14 |
[컴퓨터시스템구조] 07. MIPS 논리 연산자(sll, srl, and, or, nor) (0) | 2023.10.14 |
[컴퓨터시스템구조] 06. MIPS 포맷(R-포맷, I-포맷) (1) | 2023.10.14 |
[컴퓨터시스템구조] 05. Signed, Unsigned, 2의 보수 (0) | 2023.10.14 |