- 사용 opcode : lw, add, sub, li, move
- 사용 system call : 1, 10
1. 문제
1+6-5를 계산하고 결과값을 출력해라.
2. 정답
.data
A: .word 1
B: .word 6
C: .word 5
.text
main:
lw $t0, A
lw $t1, B
add $s0, $t0, $t1
lw $t2, C
sub $s1, $s0, $t2
move $a0, $s1
li $v0, 1
syscall
li $v0, 10
syscall
3. 풀이
숫자를 계산하기 위해서는 먼저 숫자를 저장할 공간이 필요합니다. 변수를 선언한 후 숫자를 할당해줍니다.
.data
A : .word 1
B : .word 6
C : .word 5
덧셈에 필요한 변수(A와 B)의 데이터를 레지스터에 로드해준 후 add opcode를 사용해 더하기를 수행합니다. 'add $s0, $t0, $t1'은 $t0, $t1의 값을 더하고 그 결과를 $s0에 넣어준다는 의미입니다.
lw $t0, A
lw $t1, B
add $s0, $t0, $t1 # $s0=$t0+$t1
뺄셈을 하기 위해 C의 값을 $t2에 로드해줍니다. 그리고 sub opcode를 사용해 빼기를 수행합니다. 'sub $s1, $s0, $t2'는 $s0에서 $t2를 뺀 결과를 $s1에 넣어준다는 의미입니다. sub opcode를 사용하실 때는 순서에 유의하셔야합니다.
lw $t2, C
sub $s1, $s0, $t2 # $s1=$s0-$t2
s1레지스터의 값을 함수 인수를 저장하는 레지스터 a0에 복사해줍니다. 그리고 system call을 사용해 값을 출력해줍니다. 이때, int값 출력에 사용되는 system call code는 1번입니다.
move $a0, $s1
li $v0, 1
syscall
출력을 마치셨다면 마지막으로 코드가 끝났다는 것을 알려주어야 합니다. 이는 system call code 10번을 사용하면 됩니다.
li $v0, 10
syscall
4. c++ 코드로 표현
풀이한 어셈블리어 코드를 c++로 표현하면 다음과 같습니다.
#include <stdio.h>
int main() {
int A = 1;
int B = 6;
int C = 5;
printf("%d", A+B-C);
}
'Programming > Assembly Language' 카테고리의 다른 글
[MIPS] QtSpim 예제 4 - 값을 입력받아 곱셈 수행하기 (0) | 2020.11.08 |
---|---|
[MIPS] QtSpim 예제 3 - 나눗셈(몫과 나머지 출력) (0) | 2020.11.07 |
[MIPS] QtSpim 예제 1 - 문자 출력하기 (0) | 2020.11.05 |
[MIPS] QtSpim 기본 문법 (0) | 2020.11.04 |
[MIPS] QtSpim 사용법 (0) | 2020.11.03 |