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

[MIPS] MIPS programming 과제 - 두 정수 비교하기

by Ruas 2021. 11. 2.
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. 사용자로부터 임의의 양의 정수 두 개를 입력받고, 입력받은 두 개의 정수 중 큰 값을 출력하라.

 

이번 문제에서는 사용자로부터 변수를 입력받아야 합니다.

 

시작하기에 앞서 C++로 설명하겠습니다.

 

int a = 0;
int b = 0;

int main(void){
	cin >> a >> b;
    if(a < b){
    	cout << b
    }
    else{
    	cout << a
    }
    
    return 0;
}

 

큰 어려움 없이 구현할 수 있는 간단한 코드입니다.

여기서 if/else 문으로 크기를 비교하는 구조를 어셈블리어에서는 'slt'라는 명령어를 사용해서 구현할 예정입니다.

 

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

 

먼저 입력 받을 변수 a와 c를 0으로 초기화한 상태로 선언합니다.

 

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

    li $v0, 5
    syscall
    sw $v0, c

 

선언한 변수에 사용자 입력값을 저장하는 과정은 main 함수에서 진행합니다.

문제에서 정수의 크기 비교라고 지정하였으니, int 타입의 변수를 입력받을 수 있도록 합니다.

 

li $v0, 5 가 이 역할을 수행합니다.

int 입력을 담당하는 syscall은 5 입니다.

사용자로 부터 int 타입의 값을 입력 받아 $v0 레지스터에 저장합니다.

 

현재 사용자의 입력 값을 받아 레지스터에 저장하는 단계까지 완료했습니다.

레지스터에 저장을 했다는 것이 변수에 값을 전달한 상태는 아니기 때문에 추가적으로 진행해야하는 과정이 있습니다.

 

sw 명령어를 사용하여 레지스터에 있는 값을 변수로 이동시켜 주겠습니다.(sw $v0, a / sw $v0, c)

 

    slt $s0, $t1, $t2

 

이제 본격적으로 두 정수의 크기를 비교하는 코드를 구현합니다.

 

위에서 언급했다 시피, 두 정수의 비교는 slt를 사용합니다.

slt의 경우 slt $s0, $t1, $t2 의 형태로 사용합니다.

 

$t1와 $t2의 크기를 비교하였을 때, 

$t1 < $t2 이면 $s0 = 1
$t1 > $t2 이면 $s0 = 1

의 방식으로 두 정수의 크기를 비교하게 됩니다.

비교 연산이 완료되면, $s0에 저장된 값을 사용하여 어떤 정수가 더 큰지 출력을 하게 됩니다.

 

    beq $s0, 0, abig
    beq $s0, 1, cbig

 

출력을 하기에 앞서, $s0의 값을 판단하는 코드를 구현합니다.

 

'beq'의 경우 main 함수 밖에 선언된 별도의 함수를 호출하는 기능을 합니다.

여기서 beq $s0, 0, abig 는

$s0 == 0 일 경우에 abig 함수로 이동하라는 의미입니다.

 

$s0의 값의 0과 1로 나뉘어 지기 때문에 두 개의 별도 함수를 준비해 줍니다.

 

abig:
    move $a0, $t1
    li $v0, 1
    syscall

    li $v0, 10
    syscall

 

먼저 함수 abig의 경우 $s0 = 0인 상황으로, 변수 a($t1) 가 $t2보다 큰 경우를 위한 함수입니다.

$t1가 더 큰 수인 경우이기 때문에 $a0에 $t1의 값을 전달하여 출력합니다.

 

출력 이후 프로그램을 종료합니다.

 

cbig:
    move $a0, $t2
    li $v0, 1
    syscall

    li $v0, 10
    syscall

 

함수 cbig의 경우 $s0 = 1인 상황으로, 변수 c($t2) 가 $t1보다 큰 경우를 위한 함수입니다.

$t2이 더 큰 수인 경우이기 때문에 $a0에 $t2의 값을 전달하여 출력합니다.

 

출력 이후 프로그램을 종료합니다.

 

 

 

 

아래는 전체 코드 입니다.

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

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

    li $v0, 5
    syscall
    sw $v0, c

    lw $t1, a
    lw $t2, c

    slt $s0, $t1, $t2
    beq $s0, 0, abig
    beq $s0, 1, cbig

abig:
    move $a0, $t1
    li $v0, 1
    syscall

    li $v0, 10
    syscall
cbig:
    move $a0, $t2
    li $v0, 1
    syscall

    li $v0, 10
    syscall

 

이상입니다.

728x90

댓글