오늘은 MIPS를 사용하여 특정 정수보다 작은 정수 중 가장 큰 4개의 숫자를 내림차순으로 출력하는 코드를 설명드리겠습니다.
해당 포스트를 진행하기에 앞서 기본적인 opcode 학습이 필요합니다.
Q. 사용자로부터 양의 정수 하나를 입력 받고, 이 정수보다 작은 정수 중 가장 큰 값 4개를 내림차순으로 출력하는 반복문을 작성하시오.
시작하기에 앞서 C++ 코드를 먼저 보여드리겠습니다.
int a = 0;
int main(void){
cin >> a;
for(int i = 0; i < 4; i++){
a = a - 1;
cout << a;
}
return 0;
}
먼저 입력 받을 변수 a를 0으로 초기화한 상태로 선언합니다.
.data
a: .word 0
i: .word 1
.text
추가적으로 for문에서 사용하는 i와 같은 역할을 담당할 변수 역시 이곳에서 선언합니다.
main:
li $v0, 5
syscall
sw $v0, a
lw $t0, i
lw $t1, a
선언한 변수에 사용자 입력 값을 저장하는 과정은 main 함수에서 진행합니다.
정수를 입력 받아 진행할 예정이므로 int 타입의 변수를 입력받을 수 있도록 합니다.
li $v0, 5 가 이 역할을 수행합니다.
int 입력을 담당하는 syscall은 5 입니다.
사용자로 부터 int 타입의 값을 입력 받아 $v0 레지스터에 저장합니다.
마지막으로 $v0 레지스터에 저장된 값을 변수 a로 전달합니다.(sw)
이후 다른 함수에서 연산을 진행할 수 있도록 $t0, $t1 레지스터에 변수 i와 a의 값을 전달합니다. (lw)
func:
sub $s0, $t1, $t0
move $a0, $s0
li $v0, 1
syscall
add $t0, $t0, 1
beq $t0, 5, result
j func
이제 본격적으로 연산을 시작합니다.
sub $s0, $t1, $t0를 사용하여 a - i 연산을 합니다.
여기서 나온 결과를 $s0에 전달하고, 이를 다시 $a0 레지스터로 전달합니다.
이후 $a0에 저장된 결과를 먼저 출력하고,
i의 값을 증가시키는 과정에 들어갑니다.
add $t0, $t0, 1 을 통해 $t0에 저장되어있는 i의 값을 1 증가시킵니다.
이 과정은 $t0의 값이 5에 도달하면 자동으로 result 함수로 result 함수로 이동합니다.
아직 result 함수로 이동할 조건이 만족되지 않은 경우에는func 로 jump 합니다.같은 함수로 jump하게 되면, 해당 함수 내에서 조건이 만족하여 다른 함수로 이동하기 전까지같은 함수를 반복 실행하게 됩니다.
result:
li $v0, 10
syscall
result 함수에서는 단순히 프로그램의 종료만 담당합니다.
func 함수에서 모든 결과 값들을 이미 출력한 상태이기 때문에, 해당 함수에서는 프로그램을 종료하여 끝나게 됩니다.
아래는 전체 코드 입니다.
.data
a: .word 0
i: .word 1
.text
main:
li $v0, 5
syscall
sw $v0, a
lw $t0, i
lw $t1, a
func:
sub $s0, $t1, $t0
move $a0, $s0
li $v0, 1
syscall
add $t0, $t0, 1
beq $t0, 5, result
j func
result:
li $v0, 10
syscall
이상입니다.
'소프트웨어 > 컴퓨터 구조(MIPS)' 카테고리의 다른 글
[MIPS] MIPS programming 과제 - ((i + j) * 2) 연산 수행 (0) | 2021.11.11 |
---|---|
[MIPS] MIPS programming 과제 - 절대 값 계산하기 (0) | 2021.11.09 |
[MIPS] MIPS programming 과제 - 두 정수 비교하기 (0) | 2021.11.02 |
[MIPS] MIPS programming 과제 - 정수의 나눗셈 (0) | 2021.10.27 |
[MIPS] MIPS programming 과제 - 정수의 덧셈 뺄셈 (0) | 2021.10.23 |
댓글