- 사용 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 |