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로 돌아가서 조건이 일치하지 않을 때까지 반복해서 수행합니다.
◡̈