본문 바로가기

Programming/Assembly Language

[MIPS] QtSpim 예제 6 - 반복문 구현

  • 사용 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);
	}

}