본문 바로가기
컴퓨터시스템구조

[컴퓨터시스템구조] 08. MIPS 조건부 연산자(beq, bne, j, slt)

by 파스텔코랄 2023. 10. 14.

조건부 연산자

  • 조건이 참인 경우 레이블이 지정된 명령어로 분기
    • 그렇지 않은 경우 순차적으로 계속 진행
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는 거짓

 

 

댓글