# 組語筆記(MIPS)
## 作業一
### 基本框架
```
.data
.text
```
### 印字串
```
.data
output: .asciiz "Hello World!\n\0"
.text
li $v0, 4
la $a0, output
syscall
```
### 印數字
```
.data
number: .word 66
.text
li $v0, 1
lw $a0, number
syscall
```
### 兩數和
```
.data
output1: .asciiz "Enter a number: \0"
output2: .asciiz "Enter another number: \0"
output3: .asciiz "The sum is: "
.text
# print "Enter a number: "
li $v0, 4
la $a0, output1
syscall
# read int
li $v0, 5
syscall
# set t0 = input number
move $t0, $v0
# print "Enter another number: "
li $v0, 4
la $a0, output2
syscall
# read int
li $v0, 5
syscall
# set t1 = input number
move $t1, $v0
# t0 = t0 + t1
add $t0, $t0, $t1
# print "The sum is "
li $v0, 4
la $a0, output3
syscall
# print sum
li $v0, 1
move $a0, $t0
syscall
```
### 條件判斷
```
.data
output: .asciiz "Please enter a number: \0"
output1: .asciiz "Number is lager than 10!\n\0"
output2: .asciiz "Number is equal to 10!\n\0"
output3: .asciiz "Number is less than 10!\n\0"
.text
# print "Please enter a number: "
li $v0, 4
la $a0, output
syscall
# read int
li $v0, 5
syscall
# set t0 = input number
move $t0, $v0
If:
# if t0 == 10, goto Equal
beq $t0, 10, Equal
# if t0 < 10, goto Less
slti $t1, $t0, 10
beq $t1, 1, Less
# if t0 > 10
# print "Number is larger than 10!"
li $v0, 4
la $a0, output1
syscall
# jump to End
j End
Equal:
# print "Number is equal to 10!"
li $v0, 4
la $a0, output2
syscall
# jump to End
j End
Less:
# print "Number is less than 10!"
li $v0, 4
la $a0, output3
syscall
End:
```
## 作業二
### 印陣列
```
.data
vector: .word 11,1,2,3,4,5,6,7
newline: .asciiz "\n\0"
.text
# set counter t0 = 0
li $t0, 0
# t1 = vector[0]
la $t1, vector
loop:
# if t0 == 8, goto Exit
beq $t0, 8, Exit
# t2 = vector[i]
lw $t2, ($t1)
# print vector[i]
move $a0, $t2
li $v0, 1
syscall
# print newline
li $v0, 4
la $a0, newline
syscall
# counter t0++
addi $t0, $t0, 1
# vector array go to next byte
addi $t1, $t1, 4
j loop
Exit:
```
### 讀字串&印字串
```
.data
input: .space 1024
.text
# read input string
li $v0, 8
la $a0, input
li $a1, 20 # max allowance
syscall
# set t0 = string
move $t0, $a0
# print string
li $v0, 4
la $a0, input
syscall
```
### 讀字串&輸出長度
```
.data
input: .space 1024
output: .asciiz "The string length (including '\n') is \0"
.text
# read input string
li $v0, 8
la $a0, input
li $a1, 32 # max allowance
syscall
# set t0 = string
move $t0, $a0
# set s0 =0 , count string length
li $s0, 0
loop:
# load one byte
lb $s1, ($t0)
# if s1 == '\0', break
beqz $s1, Exit
# counter++
addi $s0, $s0, 1
# go to next byte
addi $t0, $t0, 1
j loop
Exit:
#print "The string length is "
li $v0, 4
la $a0, output
syscall
# print length
li $v0, 1
move $a0, $s0
syscall
```
## 作業三
### 函數加法
```
.data
.text
li $t0, 3
li $t1, 5
jal Add
li $v0, 1
move $a0, $t2
syscall
li $v0, 10 # end the program
syscall
Add:
add $t2, $t0, $t1
jr $ra
```