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

[MIPS] MIPS programming 과제 - 연속된 정수 출력하기

by Ruas 2021. 11. 3.
728x90

오늘은 MIPS를 사용하여 특정 정수보다 작은 정수 중 가장 큰 4개의 숫자를 내림차순으로 출력하는 코드를 설명드리겠습니다.

 

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

 

[MIPS] MIPS programming 기본

 

[MIPS] MIPS programming 기본

opcode Artithmetic Instructions opcode 사용 방법 의미 add add $s1, $t0, $t1 $s1 = $t0 + $t1 sub sub $s1, $t0, $t1 $s1 = $t0 - $t1 mul mul $s1, $t0, $t1 $s1 = $t0 * $t1 mult mult $t0, $t1 Lo, Hi..

ruas-coding.tistory.com

 

 

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

이상입니다.

728x90

댓글