본문 바로가기
소프트웨어/컴퓨터 구조(MIPS)

[MIPS] MIPS programming 과제 - N개의 별 출력하기

by Ruas 2021. 12. 17.
728x90

 

오늘은 MIPS를 사용하여 N개의 문자를 출력하는 코드를 설명드리겠습니다.

 

해당 포스트를 진행하기에 앞서 기본적인 opcode 학습이 필요합니다.

 

 

[MIPS] MIPS programming 기본

 

[MIPS] MIPS programming 기본

opcode Artithmetic Instructions opcode 사용 방법 의미 add add $s1, $t0, $t1 $s1 = $t0 + $t1 addi addi $s1, $t0, Int $s1 = $t0 + Int sub sub $s1, $t0, $t1 $s1 = $t0 - $t1 mul mul $s1, $t0, $t1 $s1..

ruas-coding.tistory.com

 

 

Q. syscall을 사용하여 사용자로부터 자연수를 입력받고, 첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 출력하는 프로그램을 작성하시오.

 

이번 문제는 사용자의 입력을 받고, 사용자가 입력한 값까지 *의 출력을 반복하는 프로그램입니다.

 

먼저 프로그램에서 사용할 변수를 선언합니다.

 

    .data
a: .word 0 
c: .word 1
d: .asciiz "*"
m: .word 0
n: .asciiz "\n"
    .text

 

각각의 변수가 하는 역할은

 

a: 입력 및 반복 횟수

c: 회차당 출력해야하는 *의 개수

d: 출력할 * 문자

m: 현 회차에서 출력한 *의 개수

n: 다음 줄로 변경하기 위한 문자 (new line)

 

입니다.

 

다음으로 사용자의 입력 값을 받고,

위에서 선언한 변수들을 레지스터로 전달해 줍니다.

 

main:
    li $v0, 5
    syscall
    sw $v0, a

    lw $t0, a
    lw $t1, c
    la $t2, d
    lw $t3, m
    la $t4, n

 

*의 출력은 loop 함수에서 담당합니다.

때문에 main 함수에서 loop 함수로 jump 하기 위한 코드를 작성합니다.

 

    jal loop

 

loop 함수의 구조는 다음과 같습니다.

 

1. * 출력

 

    move $a0, $t2
    li $v0, 4
    syscall

 

2. 현 회차에서 출력한 *의 개수 증가

 

addi $t3, $t3, 1

 

3. 회차당 출력 횟수를 만족했는지 확인

 

bne $t3, $t1, loop

 

4. 회차당 출력 만족시 다음줄로 출력 변경

 

    move $a0, $t4
    li $v0, 4
    syscall

 

5. 현 회차에서 출력한 *의 개수 초기화

 

mul $t3, $t3, $zero

 

$t3 레지스터에 0을 곱하는 형식으로 초기화를 해줍니다.

 

6. 총 반복 횟수 감소

 

addi $t0, $t0, -1

 

7. n번째에 맞게 해당 회차에서 출력할 *의 개수 증가

 

addi $t1, $t1, 1

 

8. 총 반복 횟수가 0일 때 까지 반복

 

bne $t0, 0, loop

 

$t0 레지스터가 0이 되기 이전까지 계속 loop 함수로 jump 합니다.

이때 loop 함수의 첫부분으로 이동하기 때문에 무한으로 반복하는 반복문이 만들어집니다.

 

9.  main 함수 복귀

 

jal $ra

 

다소 복잡하게 느껴질 수 있지만 c++등의 언어에서 작성하면 전혀 어려운 코드가 아닙니다.

for문과 같은 반복문을 중첩하는 구조라고 생각하시면 됩니다.

 

 

 

 

아래는 전체 코드 입니다.

 

    .data
a: .word 0 
c: .word 1
d: .asciiz "*"
m: .word 0
n: .asciiz "\n"
    .text

main:
    li $v0, 5
    syscall
    sw $v0, a

    lw $t0, a # 입력 및 반복 횟수
    lw $t1, c # 회차당 출력해야하는 *의 개수
    la $t2, d # 출력할 * 문자
    lw $t3, m # 현 회차에서 출력한 *의 개수
    la $t4, n # new line

    jal loop # loop 함수로 jump

    li $v0, 10
    syscall
    # 시스템 종료

loop:
    move $a0, $t2
    li $v0, 4
    syscall
    # * 츌력

    addi $t3, $t3, 1 # 현 회차에서 출력한 * 증가
    bne $t3, $t1, loop # 회차당 출력해야하는 *의 개수 != 현 회차에서 출력한 * 일 경우 반복

    move $a0, $t4
    li $v0, 4
    syscall
    # 해당 회차에서 출력할 * 개수 만족시 다음 줄로 출력할 수 있도록 변경

    mul $t3, $t3, $zero # 현 회차 출력 수 초기화
    addi $t0, $t0, -1 # 반복해야하는 횟수 감소
    addi $t1, $t1, 1 # 출력해야하는 *의 개수 증가
    bne $t0, 0, loop # 반복해야하는 회수 != 0 일 경우 반복
    
    jal $ra # 반복문 종료시 main 함수로 이동

 

아래 이미지는 출력 결과 입니다.

 

 

이상입니다.

728x90

댓글