본문 바로가기

Programming/Assembly Language

[MIPS] QtSpim 예제 2 - 더하기, 빼기

  • 사용 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);
}