Programming/Assembly Language
[MIPS] QtSpim 예제 3 - 나눗셈(몫과 나머지 출력)
hi-choi
2020. 11. 7. 00:28
- 사용 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);
}