본문 바로가기

Programming/Assembly Language

[MIPS] QtSpim 기본 문법

  1. 주석
  2. opcode
  3. .data vs .text
  4. Register
  5. System Call

 

1. 주석


코드의 앞에 #을 쓰면 주석 처리를 할 수 있습니다.

 

 

2. opcode


opcode는 operations code의 약자로 어떤 연산을 수행할 것인가를 알려줍니다.

 

 

① 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 = $t0 × $t1
div 나누기 div $t0, $t1 Lo = $t0 ÷ $t1의 몫 , Hi = $t0 ÷ $t1의 나머지
mflo Lo의 값 불러오기 mflo $s1 $s1 = Lo
mfhi Hi의 값 불러오기 mfhi $s1 $s1 = Hi

 

 

② Data Transfer Instructions

 

opcode 예제 의미
lw 단어를 로드 lw $t1, A 레지스터($t1)에 메모리(A)의 데이터를 로드
li 바로 로드 li $a0, 12 레지스터($a0)에 바로 12를 로드
la 주소 로드 la $a0, A 레지스터($a0)에 A의 주소를 로드
sw 저장 sw $v0, A 메모리(A)에 레지스터(v0)의 값을 저장

 

③ Logic Instructions

 

opcode 예제 의미
beq 두 값이 같을 경우 beq $t0 $t1 A $t0 == $t1 이라면 A 함수로 이동
bne 두 값이 다를 경우 beq $t0 $t1 A $t0 != $t1 이라면 A 함수로 이동
slt 크기 비교 slt $s0, $t0, $t1 $t0 < $t1 이라면 $s0는 1 아니면 $s0는 0
slti 크기 비교 slti $s0, $t0, 10 $t0 <10 이라면 $s0는 1 아니면 $s0는 0

 

④ Branch and Jump-Related Instrutions

 

opcode 예제 의미
j 주소로 이동(점프) j A A 주소로 바로 이동(점프)
jr 레지스터로 이동(점프) jr $s1 $s1 레지스터로 바로 이동(점프)
jar 점프 후 다음 명령어 주소 전달 jar A A 주소로 이동 후 ra 레지스터에 다음 명령어 주소 전달

 

3. .data vs .text


.datastatic data를 쓰는 공간으로 주로 변수를 선언하는 데 사용합니다. 

.text는 수행하고자 하는 code를 쓰는 공간입니다. main 함수를 비롯한 다양한 함수를 작성합니다.

 

  .data #변수 선언

      msg : .asciiz "Hello World!"
    
  .text #코드 작성

  main :

      la $a0, msg
      li $v0, 4
      syscall
    
      li $v0, 10
      syscall

 

 

4. MIPS Registers


번호 이름 용도
$0 $zero   고정된 값 0 출력. 변경 X
$1 $at   어셈블러를 위해 예약된 레지스터 (의사 명령어 결과 저장)
$2 ~ $3 $v0 ~ $v1   함수로부터 반환된 값을 저장 시 사용
$4 ~ $7 $a0 ~ $a3   함수 인수 저장 시 사용
$8 ~ $15 $t0 ~ $t7   임시로 값을 저장할 때 사용 (자주 바뀌는 값)
$16 ~ $23 $s0 ~ $s7   자주 바뀌지 않고 오랫동안 사용하는 값을 저장할 때 사용
$24 ~ $25 $t8 ~ $t9   임시로 값을 저장할 때 사용 (자주 바뀌는 값)
$26 ~ $27 $k0 ~ $k1   OS Kernel을 위해 예약된 레지스터
$28 $gq   global pointer 값 저장 시 사용
$29 $sp   stack pointer 값 저장 시 사용
$30 $fp   frame pointer 값 저장 시 사용
$31 $ra   return address 값 저장 시 사용

 

 

5. System Call


시스템 콜은 복잡한 코드를 작성할 필요 없이 호출만으로 특정 기능을 사용하도록 편의성을 제공하는 기능입니다. 

 

System Call Code Number 수행 내용 System Call Code Number 수행 내용
1 print int 6 read_float
2 print float 7 read_double
3 print double 8 read_string
4 print string 9 sbrk
5 read_int 10 exit

 

1번 ~ 4번은 데이터의 출력을 담당합니다. 5번 ~ 8번은 데이터의 입력을 담당하며 사용자로부터 값을 입력받을 때 주로 사용합니다. 9번은 메모리 할당을 할 때 사용하며 10번은 코드의 끝을 알려주어 프로그램을 종료할 때 사용합니다.