본문 바로가기

Programming/Assembly Language

[MIPS] QtSpim 예제 3 - 나눗셈(몫과 나머지 출력)

  • 사용 opcode : lw, div, mflo, mfhi, li, move
  • 사용 system call : 1, 10

1. 문제


 

55÷16의 몫과 나머지를 출력해라.

 

 

 

2. 정답


.data
    A: .word 55
    B: .word 16

.text

main:
    lw $t0, A
    lw $t1, B
    div $t0, $t1
    mflo $s0
    mfhi $s1
    
    move $a0, $s0
    li $v0, 1
    syscall
    
    move $a0, $s1
    li $v0, 1
    syscall
       
    li $v0, 10
    syscall

 

 

 

3. 풀이


숫자를 계산하기 위해서는 먼저 숫자를 저장할 공간이 필요합니다. 변수를 선언한 후 숫자를 할당해줍니다.

 

.data
    A : .word 55
    B : .word 16

 

나눗셈에 필요한 변수(A와 B)의 데이터를 레지스터에 로드해준 후 div opcode를 사용해 나누기를 수행합니다. 'div $t0, $t1'은 $t0의 값을 $t1의 값으로 나눈다는 의미입니다.  

 

lw $t0, A
lw $t1, B
div $t0, $t1  # $t0/$t1

 

나눗셈을 수행한 후 몫은 LO레지스터에 나머지는 HI레지스터에 저장됩니다. 이 값들은 mflo와 mfhi opcode를 사용해 불러올 수 있습니다.

 

mflo $s0  #몫
mfhi $s1  #나머지

 

몫을 출력하기 위해 s0레지스터의 값을 레지스터 a0에 복사해줍니다. 그리고 system call을 사용해 값을 출력해줍니다. 이때, int값 출력에 사용되는 system call code는 1번입니다. 나머지도 같은 방식으로 출력하시면 됩니다.

 

move $a0, $s0
li $v0, 1
syscall

move $a0, $s1
li $v0, 1
syscall

 

출력을 마치셨다면 마지막으로 코드가 끝났다는 것을 알려주어야 합니다. 이는 system call code 10번을 사용하면 됩니다.

 

li $v0, 10
syscall

 

4. c++ 코드로 표현


풀이한 어셈블리어 코드를 c++로 표현하면 다음과 같습니다.

 

#include <stdio.h>

int main() {
	
    int A = 55;
    int B = 16;
   
    printf("%d%d", A/B, A%B);
}