본문 바로가기

Programming/Assembly Language

[MIPS] QtSpim 예제 5 - 조건문 (두 수 크기 비교)

  • 사용 opcode : li, move, slt, beq
  • 사용 system call : 1, 5, 10

1. 문제


두 개의 정수를 입력받고 더 큰 값을 출력해라.

 

 

2. 정답


.text

main : 

  li $v0, 5
  syscall
  move $t0, $v0

  li $v0, 5
  syscall
  move $t1, $v0
 
  slt $s0, $t0, $t1
  beq $s0, 1, function

  move $a0, $t0
  li $v0, 1
  syscall

  li $v0, 10
  syscall

function :

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

  li $v0, 10
  syscall 

 

 

 

 

 

3. 풀이


system call code 5번을 사용해 숫자를 입력받고 레지스터에 값을 복사해줍니다. 첫번째 숫자는 $t0에 두번째 숫자는 $t1에 보관하겠습니다.

 

 li $v0, 5     
 syscall
 move $t0, $v0

 li $v0, 5
 syscall
 move $t1, $v0

 

 

숫자의 크기를 비교할 때는 slt opcode를 사용합니다. 'slt $s0, $t0, $t1은 $t0와 $t1'의 값을 비교한 후 $t0<$t1이면 1을  $t0>$t1이면 0을 $s0레지스터에 저장합니다.

 

slt $s0, $t0, $t1

 

 

beq opcode는 두 숫자가 동일한지를 판단할 때 사용합니다. 이때, 두 숫자가 같은 숫자일 경우 특정 지점으로 이동합니다. 다른 숫자일 경우 특정 지점으로 이동하지 않고 이어지는 코드를 실행합니다. 'beq $s0, 1, function'은 $s0와 1이 같을 경우 function으로 이동하라는 의미입니다.

 

beq $s0, 1, function

 

 

실행결과 function으로 이동했다면 $s0의 값이 1이라는 의미입니다. 이를 통해 $t0 < $t1 라는 것을 알 수 있습니다. 즉, 두번째 입력받은 값이 더 크다는 뜻입니다. 그러므로 $t1의 값(두번째 입력 숫자)을(를) 출력해줍니다. 정수의 출력은 system call code 1번을 호출해 할 수 있습니다. 출력이 끝났다면 system call code 10번을 호출해 코드가 끝났음을 알려줍니다.

 

function :

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

 li $v0, 10
 syscall 

 

 

실행결과 function으로 이동하지 않았다면 $s0의 값이 0이라는 의미입니다. 이를 통해 $t0 > $t1 라는 것을 알 수 있습니다. 즉, 첫번째 입력받은 값이 더 크다는 뜻입니다. 그러므로 $t0의 값(첫번째 입력 숫자)을(를) 출력해줍니다. 정수의 출력은 system call code 1번을 호출해 할 수 있습니다. 출력이 끝났다면 system call code 10번을 호출해 코드가 끝났음을 알려줍니다.

 

 move $a0, $t0
 li $v0, 1
 syscall

 li $v0, 10
 syscall

 

 

4. c++ 코드로 표현


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {

	int A = 0;
	int B = 0;
	
	scanf("%d", &A);
	scanf("%d", &B);

	if (A < B) {
    
		printf("%d", B);
        
	}
	else
		printf("%d", A);
        
}