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

[MIPS] MIPS programming 과제 - ((i + j) * 2) 연산 수행

by Ruas 2021. 11. 11.
728x90

오늘은 MIPS를 사용하여 사칙 연산을 하는 코드를 설명드리겠습니다.

 

해당 포스트를 진행하기에 앞서 기본적이 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. 정수 값 i와 j를 parameter로 받고 ((i + j) * 2) 한 결과 값을 반환하는 calculate 프로그램을 작성하시오. main 함수는 calculate 함수를 호출하고 calculate 함수의 수행 결과를 출력한다.

 

이번 문제는 프로그램을 구현하는 것이 초점이 아니라,

객체 지향성을 추구하는 프로그램을 구현하는 것에 있습니다.

 

main 함수에서는 calculate 함수에 넘겨 줄 parameter를 입력받고, calculate 함수의 결과를 출력하는 역할을,

calculate 함수에서는 main 함수로 부터 넘겨 받은 parameter를 연산하여 main 함수에 결과 값을 넘겨주는 구조입니다.

 

먼저 코드에서 사용할 변수를 선언하겠습니다.

 

    .data
a: .word 0
c: .word 0
    .text

 

문제에서 제시한 변수 i, j는 mips programming에서 변수로 사용할 수 없습니다.

일부 명령어가 이를 사용하기 때문입니다.

때문에 이번 코드에서 사용할 변수는 a와 c로 변경하여 진행합니다.

 

사용자의 입력을 받을 변수 a와 c를 0으로 초기화한 상태로 선언하고, main 함수에서 이를 입력받습니다.

 

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

 

이후 입력받은 변수를 레지스터로 전송합니다.

 

    lw $t0, a
    lw $t1, c

 

이제 입력받은 변수를 calculate 함수로 전달합니다.

이때, 사용할 명령어는 "jal" 입니다.

 

    jal calculate

 

jal 명령어의 경우 코드 순서상 다음 순번으로 실행되어야하는 명령어의 위치를 레지스터 $ra에 저장 후,

jump 하고자하는 위치로 이동합니다.

 

위의 코드는 main 함수에서 다음에 실행될 레지스터를 저장한 후 calculate 함수로 jump 하는 역할을 합니다.

 

이제 calculate 함수로 넘어가겠습니다.

 

calculate:
    add $s0, $t0, $t1 # a + c
    mul $s1, $s0, 2 # $s0 * 2

    jal $ra

 

calculate 함수에서는 문제에서 제시한 연산만을 수행합니다.

add 와 mul 명령어를 사용하여 연산을 수행한 후,

 

main 함수에서 저장한 다음 명령어의 위치인 $ra로 jump 합니다.

 

이제 다시 main 함수로 돌아오겠습니다.

 

    move $a0, $s1
    li $v0, 1
    syscall
    
    li $v0, 10
    syscall

 

이제 main 함수에서 처리할 것은 출력과 프로그램 종료입니다.

calculate 함수에서 완료한 연산의 결과를 출력한 후

syscall을 사용하여 모든 프로그램을 종료합니다.

 

 

 

 

아래는 전체 코드 입니다.

 

    .data
a: .word 0
c: .word 0
    .text

main:
    li $v0, 5
    syscall
    sw $v0, a
    #변수 a 입력
    li $v0, 5
    syscall
    sw $v0, c
    #변수 c 입력

    lw $t0, a
    lw $t1, c
    #입력받은 변수 a,c를 레지스터로 전송

    jal calculate 
    #다음 명령어 위치를 레지스터에 저장하고, calculate 함수로 jump

    move $a0, $s1
    li $v0, 1
    syscall
    #연산결과 출력
    
    li $v0, 10
    syscall
    #종료

calculate:
    add $s0, $t0, $t1 # a + c
    mul $s1, $s0, 2 # $s0 * 2

    jal $ra 
    #calculate 함수로 jump하면서 저장한 레지스터의 위치로 되돌아가기

 

이상입니다.

728x90

댓글