본문 바로가기
System SW

[2.4] MIPS Instruction Set Architecture IV - branch & jump 연산

by Hangii 2022. 10. 12.

MIPS의 Branch & Jump 연산과 비트 구조가 각 연산에서 어떻게 나타나는지 알아본다.

  • Conditional branch instructions

특정 조건을 만족했을 때, PC(program counter)값을 바꾸는 연산

  • branch on equal: register 2개 + 16bit immediate 
    • 두 레지스터 값이 같으면 branch
    • immediate값은 다음 수행해야 할 위치로부터 얼만큼 떨어진 instruction인지를 나타낸다.
    • 이를 주소 값으로 따지면 기계어 하나의 크기가 4byte이므로 다음에 실행했어야 한 명령어의 주소로부터 {4*(immediate)}byte만큼 떨어진 주소를 가리키라는 것이다. 
    • 왜 굳이 이렇게 하는가? -> 32bit로 크기가 한정된 기계어 내에서 정보를 최대한 효과적으로 표현하기 위함이다.
  • branch on not equal: register 2개 + 16bit immediate
    • 두 레지스터 값이 다르면 branch
    • beq와 같은 원리이다.
  • set on less than
    • 현재 MIPS에서는 두 레지스터 $s1, $s2의 값을 비교해 $s1이 $s2보다 작으면 branch하는 명령어가 존재하지 않는다. 하지만 $s1이 $s2보다 작으면 또 다른 레지스터 $s3의 값을 1로 설정하는 slt연산은 가능하다. 따라서 slt연산을 통해 $s3에 1을 저장하고 beq를 사용해 $s3 == 1 인 경우 특정 위치로 branch하도록 설계하는 것은 가능하다.
    • set on greater than, set on less than equal 등도 존재한다.
  • set on less than immediate
    • 어떤 레지스터 값이 immediate값보다 작으면 새 레지스터의 값을 1로 세팅
  • 어떤 값이 0인지 아닌지에 따라 branch하는 명령어의 경우, 숫자 0을 표현하기 위해 $0을 사용한다.

  • Unconditional jump instructions

무조건 PC값을 바꾸는 연산

  • jump
    • opcode(6 bit)+ (target address(26bit)/4)
    • 26bit*4 = target address
    • conditional branch과 달리 target address가 절대적인 주소이다.
    • 28bit까지만 jump가 가능하다.
  • jump register
    • opcode(6bit) + jump하고 싶은 곳의 주소를 담은 레지스터($ra)
    • 레지스터 내의 주소로 접근해야하므로 jump보다 시간이 오래 걸린다.

댓글