###### tags: `110-2學校上課` # MIPS ## 基本參數 1. .word = 整數 2. .asciiz,space,ascii = 文字 3. .float = 經度小數 4. .double = 倍經度小數 ## 線段數 ```mips= .data array: .space 404 tree:.space 1616 space:.asciiz "\n" .text la $s0,array #$s0 = &array la $s1,tree # add $t0,$0,1 # i =0 for1: beq $t0,101,endfor1 sll $t1,$t0,2 # $t1 = $t0*4 add $t2,$t1,$s0 #$t2 = $t1+$s0 addi $v0,$0,42 addi $a0,$0,0 addi $a1,$0,100 syscall sb $a0,0($t2) add $t0,$t0,1 # i ++ j for1 endfor1: addi $a0,$0,1 addi $a1,$0,1 addi $a2,$0,4 jal build j endbuild build: addi $sp,$sp,-16 sw $a0,($sp)#index sw $a1,4($sp)#left sw $a2,8($sp)#right sw $ra,12($sp)#ra bne $a1,$a2,process sll $a0,$a0,2 sll $a1,$a1,2 la $s0,tree la $s1,array add $t0,$s0,$a0#tree[index] add $t1,$s1,$a1#array[left] lw $t1,($t1) sw $t1,($t0) lw $t0,12($sp) addi $sp,$sp,16 jr $t0 process: lw $t0,($sp) lw $t1,4($sp) lw $t2,8($sp) add $t3,$t1,$t2#left+right srl $t3,$t3,1#(left+right)/=2 sll $t0,$t0,1 # index*2 add $a0,$0,$t0 add $a1,$0,$t1 add $a2,$0,$t3 jal build lw $t0,($sp) lw $t1,4($sp) lw $t2,8($sp) add $t3,$t1,$t2#left+right srl $t3,$t3,1#(left+right)/=2 addi $t3,$t3,1#(left+right)/=2+1 sll $t0,$t0,1 # index*2 addi $t0,$t0,1 # index*2+1 add $a0,$0,$t0 add $a1,$0,$t3 add $a2,$0,$t2 jal build lw $t0,0($sp) lw $t1,4($sp) lw $t2,8($sp) la $s0,tree sll $t3,$t0,3 sll $t4,$t0,3 addi $t4,$t4,4 sll $t5,$t0,2 add $s1,$s0,$t3#tree[2*index] add $s2,$s0,$t4#tree[2*index+1] add $s3,$s0,$t5#tree[index] lw $s1,($s1) lw $s2,($s2) add $t0,$s1,$s2 sw $t0,($s3) lw $t0,12($sp) addi $sp,$sp,16 jr $t0 endbuild: la $s1,tree # add $t0,$0,1 # i =0 for2: beq $t0,16,Exit add $v0,$0,1 sll $t1,$t0,2 # $t1 = $t0*4 add $t2,$t1,$s0 #$t2 = $t1+$s0 lw $a0,0($t2) syscall add $t0,$t0,1 # i ++ addi $v0, $zero, 4 # print_string syscall la $a0, space # load address of the string syscall j for2 Exit: ``` ## Read interger and print ```mips= .data istrution:.ascii "Read a interger to print:" .text main: li $v0,4 la $a0,istrution syscall li $v0,5 syscall move $a0,$v0 li $v0,1 syscall ``` ## Read float and print ```mips= .data istrution:.ascii "Read a float to print:" .text main: li $v0,4 la $a0,istrution syscall li $v0,6 syscall mov.s $f12,$f0 li $v0,2 syscall ``` ## Read str and print ```mips= .data istrution:.asciiz "Read a string to print:" buffer: .space 8080 .text main: li $v0,4 la $a0,istrution syscall li $v0,8 la $a0,buffer la $a1,100 syscall li $v0,4 la $a0,buffer syscall ``` ## print ramdom nuber ```mips= .data istrution:.ascii "Print a Random(1~100):" .text main: li $v0,4# Load print string service la $a0,istrution#Load argument syscall li $v0,42#Load read interget service la $a1,100 syscall move $a0,$v0#move address $v0 to $a0 li $v0,1#Load print interget service syscall ``` ## Input Output Dialog ```mips= .data istrution:.ascii "Input output dialog " str_empty:.asciiz "" str_buffer:.asciiz "" str_maxsize:.word 100 .text main: li $v0,4# Load print string service la $a0,istrution#Load argument syscall li $v0,54#Load Input Dialog service la $a0,str_empty la $a1,str_buffer lw $a2,str_maxsize syscall li $v0,59 la $a0,str_empty la $a1,str_buffer syscall ``` ## Array 操作 ```mips= .data array:.space 40 # array is a array divide by 4 .text li $v0,1 la $t0,array # $t0 = &array li $s0,10 # $s0=10 sw $s0,0($t0) #$t0 = $s0 lw $a0,($t0) syscall ``` ## IF ``` .text li $v0 ,1 li $t0,10 li $t1,11 beq $t0,$t1,else la $a0,100 j exp else: la $a0,99 exp: syscall ``` # print 0~99 ```mips= .text li $t0,0 Loop: li $v0,1 move $a0,$t0 syscall addi $t0,$t0,1 bne $t0,100,Loop ``` ## 費式數列 ```mips= .text main: addi $a0,$0,12 jal fact j exit fact: addi $sp,$sp,-16 sw $a0,0($sp) sw $ra,4($sp) bgt $a0,1,re add $v0,$a0,$0 lw $t0,4($sp) addi $sp,$sp,16 jr $t0 re: lw $t0,($sp) addi $a0,$t0,-1 jal fact sw $v0,8($sp) lw $t0,($sp) addi $a0,$t0,-2 jal fact sw $v0,12($sp) lw $t0,8($sp) lw $t1,12($sp) add $v0,$t0,$t1 lw $t0,4($sp) addi $sp,$sp,16 jr $t0 exit: add $a0,$0,$v0 addi $v0,$0,1 syscall ``` ```mips addi $a0,$0,1 addi $a1,$0,1 addi $a2,$0,100 j for2 jal build build: addi $sp,$sp,-16 bne $a1,$a2,process addi $sp,$sp,16 sll $a0,$a0,2 sll $a1,$a1,2 la $s0,array la $s1,tree add $s0,$s0,$a1#tree[index] add $s1,$s1,$a0#array[left] sw $s1,($s0) lw $t0,12($sp) jr $t0 process: sw $a0,($sp)#index sw $a1,4($sp)#left sw $a2,8($sp)#right sw $ra,12($sp)#right lw $t0,($sp) lw $t1,4($sp) lw $t2,8($sp) add $t3,$t1,$t2#left+right srl $t3,$t3,1#(left+right)/=2 sll $t0,$t0,1 # index*2 lw $a0,($t0) lw $a1,($t1) lw $a2,($t3) jal build lw $t0,($sp) lw $t1,4($sp) lw $t2,8($sp) add $t3,$t1,$t2#left+right srl $t3,$t3,1#(left+right)/=2 addi $t3,$t3,1#(left+right)/=2+1 sll $t0,$t0,1 # index*2 addi $t0,$t0,1 # index*2+1 lw $a0,($t0) lw $a1,($t3) lw $a2,($t2) jal build lw $t0,0($sp) lw $t1,4($sp) lw $t2,8($sp) la $s0,tree sll $t3,$t0,2 sll $t4,$t0,2 sll $t5,$t0,2 addi $t4,$t4,1 add $s1,$s0,$t3#tree[2*index] add $s2,$s0,$t4#tree[2*index+1] add $s3,$s0,$t5#tree[index] add $t0,$s1,$s2 sw $t0,($s3) addi $sp,$sp,16 lw $t0,12($sp) jr $t0 Exit2: ``` ## 考試 ### BMI ```mips .data input_w :.asciiz "Input Weight" input_h:.asciiz "Input Height" .text main: addi $v0,$0,4 la $a0,input_w syscall addi $v0,$0,6 syscall mov.s $f3,$f0 addi $v0,$0,4 la $a0,input_h syscall addi $v0,$0,6 syscall mov.s $f4,$f0 mul.s $f4,$f4,$f4 div.s $f12,$f3,$f4 addi $v0,$0,2 syscall #bmi = weight/height^2 ``` ## 乘法器 ```mips= .data A:.word 9487 B:.word 9487 .text addi $t0,$0,1#i addi $t1,$0,0#ans la $t2,A lw $t2,($t2) la $t3,B lw $t3,($t3) For: beq $t0,32,EndFor andi $t4,$t3,1 beq $t4,0,Else True: add $t1,$t1,$t2 Else: addi $t0,$t0,1 srl $t3,$t3,1 sll $t2,$t2,1 j For EndFor: li $v0,1 add $a0,$0,$t1 syscall ``` ## 除法器 ```mips= .data A:.word 9487 B:.word 3 .text addi $t0,$0,1#i addi $t1,$0,0#ans la $t2,A lw $t2,($t2) la $t3,B lw $t3,($t3) la $t7,B lw $t7,($t7) Align: bgt $t3,$t2,End_Align sll $t3,$t3,1 j Align End_Align: srl $t3,$t3,1 For: beq $t0,32,EndFor sub $t4,$t2,$t3 blt $t4,0,Else True: addi $t1,$t1,1 sub $t2,$t2,$t3 Else: addi $t0,$t0,1 srl $t3,$t3,1 beq $t2,0,EndFor blt $t3,$t7,EndFor sll $t1,$t1,1 j For EndFor: li $v0,1 add $a0,$0,$t1 syscall ```