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로 점프합니다.
◡̈