# 組語筆記(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 ```