YYYEJI

[MIPS] 1부터 N 사이의 3의 배수의 합을 구하는 assembly code 본문

Computer architectures

[MIPS] 1부터 N 사이의 3의 배수의 합을 구하는 assembly code

YEJI ⍢ 2022. 10. 20. 18:00
728x90

** C code를 기준 **

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

#include <stdio.h>

int main(void){
    int i = 1;
    int sum = 0;
    int n = 15;


    while(i<=n)
    {
        if(i%3==0)
            {sum = sum +i;}
        i++;
    }


    printf("%d", sum);
    return 0;
}



C to MIPS assembly

.data
    str1: .asciiz "\nSum of multiples of 3 is "

.text
main:
    addi $t0, $zero, 0         # i = 0
    addi $t1, $zero, 0         # sum = 0
    addi $s0, $zero, 15        # n = 15
    addi $t2, $zero, 3         # t2 = 3

loop:  
    addi $t0, $t0, 1           # i += 1
    bgt $t0, $s0, exit         # if (i>n) goto exit
    div $t0, $t2               # hi = i/3
    mfhi $t3                   # t3 = hi
    bne $t3, $zero, loop       # if (t3 != 0) goto loop
    add $t1, $t1, $t0          # sum += i
    j loop                       

exit:
    li $v0, 4
    la $a0, str1
    syscall
    

    li $v0, 1
    add $a0, $zero, $t1
    syscall

.end



.text 코드를 하나하나 살펴보면

main:
    addi $t0, $zero, 0         # i = 0
    addi $t1, $zero, 0         # sum = 0
    addi $s0, $zero, 15        # n = 15
    addi $t2, $zero, 3         # t2 = 3

$t0에는 while문에서 사용할 i의 값을 초기화시켜 줍니다.
$t1에는 3의 배수의 합을 저장해줄 sum의 값을 초기화시켜 줍니다.
$s0를 통해 N의 값을 초기화시켜 줍니다.
$t2는 3의 배수임을 확인하기 위한 값이 들어있는 register입니다.


다음은 while문 입니다.

loop:  
    addi $t0, $t0, 1           # ✓1 - i += 1
    bgt $t0, $s0, exit         # ✓2 - if (i>n) goto exit
    div $t0, $t2               # ✓3 - hi = i/3
    mfhi $t3                   # ✓4 - t3 = hi
    bne $t3, $zero, loop       # ✓5 - if (t3 != 0) goto loop
    add $t1, $t1, $t0          # ✓6 - sum += i
    j loop

✓1  -  i 값을 하나 증가시켜 주고
✓2  -  bgt (pseudo code)를 통해 i와 n의 값을 비교해 줍니다.
(i가 크면 exit label로 PC의 값을 바꿔줍니다.)
✓3  -  i의 값이 3의 배수인지를 확인해줍니다.
✓4  -  mfhi(move from high register) div의 나머지 결과 값을 가져옵니다.
✓5  -  나머지 결과가 0이 아니라면 3의 배수가 아니기 때문에 처음으로 돌아갑니다.
✓6  -  나머지 결과가 0이라면 3의 배수이기 때문에 sum에 i 값을 더해줍니다.



exit label 부분은 아래 링크를 통해 확인해주세요!

exit:
    li $v0, 4
    la $a0, str1
    syscall
    

    li $v0, 1
    add $a0, $zero, $t1
    syscall

.end

https://yyyeji.tistory.com/151?category=1306702

 

[MacOS] MIPS assembly language 알아보기

아래 코드를 가지고 설명하겠습니다. ✓  코드를 작성할 땐 textEdit(메모장), visual Studio 등을 사용하시면 됩니다. ↓↓↓ C language code     ↓↓↓ #include int main(){ printf("Hello World!!!\n..

yyyeji.tistory.com

 

 

“▷" 실행 버튼을 누르면  Console 화면에 결과가 출력됩니다.

 

 

 

↓↓↓     디버깅하는 방법     ↓↓↓

제가 화면에서 누르고 있는 버튼을 누르면

코드가 한 줄씩 실행되면서 register 값이 바뀌는 것을 확인할 수 있습니다.

 

 

 

◡̈