- 사용 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);
}
'Programming > Assembly Language' 카테고리의 다른 글
[MIPS] QtSpim 예제 7 - 중첩 반복문(구구단) (0) | 2020.11.11 |
---|---|
[MIPS] QtSpim 예제 6 - 반복문 구현 (0) | 2020.11.10 |
[MIPS] QtSpim 예제 4 - 값을 입력받아 곱셈 수행하기 (0) | 2020.11.08 |
[MIPS] QtSpim 예제 3 - 나눗셈(몫과 나머지 출력) (0) | 2020.11.07 |
[MIPS] QtSpim 예제 2 - 더하기, 빼기 (0) | 2020.11.06 |