오늘은 MIPS를 사용하여 N개의 문자를 출력하는 코드를 설명드리겠습니다.
해당 포스트를 진행하기에 앞서 기본적인 opcode 학습이 필요합니다.
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 함수로 이동
아래 이미지는 출력 결과 입니다.
이상입니다.
'소프트웨어 > 컴퓨터 구조(MIPS)' 카테고리의 다른 글
[MIPS] MIPS programming 과제 - factorial 연산 (0) | 2021.11.16 |
---|---|
[MIPS] MIPS programming 과제 - array 사용하기 (0) | 2021.11.12 |
[MIPS] MIPS programming 과제 - ((i + j) * 2) 연산 수행 (0) | 2021.11.11 |
[MIPS] MIPS programming 과제 - 절대 값 계산하기 (0) | 2021.11.09 |
[MIPS] MIPS programming 과제 - 연속된 정수 출력하기 (0) | 2021.11.03 |
댓글