YYYEJI

[MIPS] While문 assembly 본문

Computer architectures

[MIPS] While문 assembly

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

** C code를 기준 **

 

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

i = 0;
while (a[i] == k) i++;

 

 

C to MIPS assembly

        addi $s0, $zero, 0     # i = 0
loop:   sll  $t0, $s0, 2       # t0 = i*4
        addi $t0, $t0, $s2     # t0 = t0 + &a[0]
        lw   $t1, 0($t0)       # t1 = a[t0]
        bne  $t1, $s1 exit     # if (t1 != s1) goto exit
        addi $s0, $s0, 1       # i = i + 1
        j loop                 # goto loop
exit:

$s0 - i

$s1 - k

$s2 - a[0]

 

 

코드를 하나하나 살펴보면

addi $s0, $zero, 0     # i = 0

우선 i 값에 0을 넣어줍니다.

 

 

sll  $t0, $s0, 2       # t0 = i*4
a[0] a[1] a[2] a[3] ... ...

주소 하나당 4 bytes를 가지고 있고

 

 

addi $t0, $t0, $s2     # t0 = t0 + &a[0]

array 인덱스 0번째의 주소를 더해줌으써 원하는 array index의 주소를 알게 됩니다.

 

 

lw   $t1, 0($t0)       # t1 = a[t0]

원하는 array의 주소를 계산하고, 주소로 가서 값을 가져옵니다.

 

 

bne  $t1, $s1 exit     # if (t1 != s1) goto exit

statement를 실행시켜 줍니다.

$t1의 값과 $s1의 값이 다르면 exit label로 이동합니다.

 

 

addi $s0, $s0, 1       # i = i + 1

i의 값을 increment 시켜줍니다.

(i++)

 

 

j loop                 # goto loop

loop label로 돌아가서 조건이 일치하지 않을 때까지 반복해서 수행합니다.

 

 

 

◡̈