YYYEJI

[MIPS] Switch문 assembly code 본문

Computer architectures

[MIPS] Switch문 assembly code

YEJI ⍢ 2022. 10. 19. 02:18
728x90

** C code를 기준 **

 

아래 코드를 MIPS assembly code로 변환해 보겠습니다.

switch (s) {
    case0: a = a
    case1: a = a + 1
    case2: a + a + 2
    default: a = a + 3
}

 

 

C to MIPS assembly

       addi $t0, $zero, 1           # t0 = 1
       addi $t1, $zero, 2           # t0 = 2
       beq  $s2, $zero, case0       # if (s == 0) goto case0
       beq  $s2, $t0, case1         # if (s == 1) goto case1
       beq  $s2, $t1, case2         # if (s == 2) goto case2
       addi $s0, $zero, 3           # a = a + 3
       j exit                       # goto exit
case0: addi $s0, $zero, 0           # a = a + 0
       j exit                       # goto exit
case1: addi $s0, $zero, 1           # a = a + 1
       j exit                       # goto exit
case2: addi $s0, $zero, 2           # a = a + 2
exit :

$s2 - s

$s0 - a

 

 

코드를 하나하나 살펴보면

addi $t0, $zero, 1           # t0 = 1

$t0에 1을 넣어줍니다.

이유는 s 값에 1이 있나 비교해주기 위해서 입니다.

 

 

addi $t1, $zero, 2           # t0 = 2

위와 마찬가지로  $t0에 2을 넣어줍니다.

이유는 s 값에 2이 있나 비교해주기 위해서 입니다.

 

 

beq  $s2, $zero, case0       # if (s == 0) goto case0
beq  $s2, $t0, case1         # if (s == 1) goto case1
beq  $s2, $t1, case2         # if (s == 2) goto case2

s의 값을 각각의 0, 1, 2와 비교합니다.

0과 같으면 case0으로 가고,

1과 같으면 case 1, 

2와 같으면 case2로 jump 됩니다.

 

 

addi $s0, $zero, 3           # a = a + 3
j exit

0, 1, 2 어떤 숫자와도 일치하지 않다면 default가 실행됩니다.

 

 

case0: addi $s0, $zero, 0           # a = a + 0
       j exit                       # goto exit
case1: addi $s0, $zero, 1           # a = a + 1
       j exit                       # goto exit
case2: addi $s0, $zero, 2           # a = a + 2

각각의 case에 맞춰 label이 이동되고,

statement에 맞춰서 수행됩니다.

 

수행이 끝나면 exit로 점프합니다.

 

 

 

 

 ◡̈