- 사용 opcode : li, move, add, beq, j
- 사용 system call : 1, 4, 5, 10
1. 문제
정수 하나를 입력받는다. 이 정수보다 큰 정수 중 가장 작은 값의 정수를 5개 출력해라. 정수의 구분은 , 으로 한다.
ex) 만약 5를 입력받았다면 6,7,8,9,10을 출력한다.
2. 정답
.data
i : .word 1
std : .asciiz ","
.text
main:
li $v0, 5
syscall
move $t1, $v0
lw $t0, i
la $s1, std
loop:
add $s0, $t1, $t0
move $a0, $s0
li $v0, 1
syscall
add $t0, $t0, 1
beq $t0, 6, end
move $a0, $s1
li $v0, 4
syscall
j loop
end:
li $v0, 10
syscall
3. 풀이
system call code 5를 호출하시면 정수를 입력받으실 수 있습니다. 입력받은 정수는 $t1 레지스터에 복사해줍니다.
li $v0, 5
syscall
move $t1, $v0
루프에 들어가기 전 데이터 영역에서 정의해준 변수들을 레지스터에 로드해줍니다.
lw $t0, i
la $s1, std
반복문을 작성하기 위해서는 j opcode를 사용해야 합니다. 아래 코드의 j loop의 경우 loop가 있는 곳으로 이동하라는 의미입니다. 즉, loop함수의 코드를 수행하다 j loop를 만나면 다시 loop함수의 시작점으로 돌아가게 되는 것입니다. 반복문의 경우 종료조건이 필요한데 이는 beq, bne와 같은 조건문을 사용해서 작성하실 수 있습니다. 아래 코드의 경우 beq문을 사용해 반복문을 종료시켰는데 t0가 6이 된다면 end로 이동하는 방식을 사용했습니다.
loop:
add $s0, $t1, $t0 # 입력받은 정수 + i
move $a0, $s0 # 값 출력
li $v0, 1
syscall
add $t0, $t0, 1 # i=i+1
beq $t0, 6, end # i=6 이면 반복문 종료
move $a0, $s1 # ',' 출력
li $v0, 4
syscall
j loop # loop 시작점으로 돌아감
end:
li $v0, 10 # 종료
syscall
4. c++ 코드로 표현
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define std ","
int main() {
int i = 1;
int num = 0;
scanf("%d", &num);
while (1) {
printf("%d", i + num);
i++;
if (i == 6)
{
break;
}
printf("%s", std);
}
}
'Programming > Assembly Language' 카테고리의 다른 글
[MIPS] QtSpim 예제 7 - 중첩 반복문(구구단) (0) | 2020.11.11 |
---|---|
[MIPS] QtSpim 예제 5 - 조건문 (두 수 크기 비교) (0) | 2020.11.09 |
[MIPS] QtSpim 예제 4 - 값을 입력받아 곱셈 수행하기 (0) | 2020.11.08 |
[MIPS] QtSpim 예제 3 - 나눗셈(몫과 나머지 출력) (0) | 2020.11.07 |
[MIPS] QtSpim 예제 2 - 더하기, 빼기 (0) | 2020.11.06 |