- 사용 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);
}'Programming > Assembly Language' 카테고리의 다른 글
| [MIPS] QtSpim 예제 5 - 조건문 (두 수 크기 비교) (0) | 2020.11.09 | 
|---|---|
| [MIPS] QtSpim 예제 4 - 값을 입력받아 곱셈 수행하기 (0) | 2020.11.08 | 
| [MIPS] QtSpim 예제 2 - 더하기, 빼기 (0) | 2020.11.06 | 
| [MIPS] QtSpim 예제 1 - 문자 출력하기 (0) | 2020.11.05 | 
| [MIPS] QtSpim 기본 문법 (0) | 2020.11.04 |