.data A: .word 1, 2, 3, 4, 5, 6, 7, 8, 8 str: .asciiz "det(A)=" .text .globl main detmin: addi $sp,$sp,-92 sw $ra,72($sp) sw $fp,68($sp) add $fp,$0,$sp sw $a0,76($fp) # salva i sw $a1,80($fp) # salva j sw $a2,84($fp) # salva o sw $a3,88($fp) # salva o0 sw $0,20($fp) # d=0 lw $v0,76($fp) # i addi $v0,$v0,1 # i+1 sw $v0,16($fp) # i1 = i+1 lw $v0,80($fp) # j addi $v0,$v0,1 # j+1 sw $v0,8($fp) # j1 = j+1 lw $v1,16($fp) # i1 lw $v0,84($fp) # o add $v0,$v1,$v0 # i1+o sw $v0,0($fp) # o1 = i1+o lw $v1,16($fp) # i1 lw $v0,88($fp) # o0 div $v1,$v0 # HI = i1 % o0 mfhi $v0 sw $v0,12($fp) # i2= i1 % o0 lw $v1,8($fp) # j1 lw $v0,88($fp) # o0 div $v1,$v0 # HI = j1 % o0 mfhi $v0 sw $v0,4($fp) # j2= j1 % o0 lw $v1,84($fp) # o addi $v0,$0,1 # 1 bne $v1,$v0,else # o!=1 --> else lw $v1,12($fp) # i2 lw $a0,4($fp) # j2 la $a1,A # &A add $v0,$0,$v1 # i2 sll $v0,$v0,1 # i2*2 add $v0,$v0,$v1 # i2*3 add $v0,$v0,$a0 # i2*3+j2 sll $v0,$v0,2 # *4 add $v0,$v0,$a1 # &A[i2][j2] lw $v0,0($v0) # A[i2][j2] sw $v0,20($fp) # d= j fine_if else: lw $v0,16($fp) # i1 sw $v0,44($fp) # k j ini_for corpo_for: lw $v1,44($fp) # k lw $v0,88($fp) # o0 div $v1,$v0 # HI = k % o0 mfhi $v0 sw $v0,40($fp) # k1= lw $v0,40($fp) addi $v1,$v0,1 # k1+1 lw $v0,88($fp) # o0 div $v1,$v0 # HI = (k1+1) % o0 mfhi $v0 sw $v0,36($fp) # k2= lw $v1,36($fp) # k2 lw $v0,76($fp) # i bne $v1,$v0,espr1 # k2 != i --> espr1 lw $v0,40($fp) # k1 addi $v1,$v0,1 lw $v0,88($fp) # o0 div $v1,$v0 # HI = (k1+1) % o0 mfhi $v0 sw $v0,32($fp) # k3= j fine_espr espr1: lw $v0,40($fp) # k1 sw $v0,32($fp) # k3= fine_espr: lw $v1,32($fp) # k3 sw $v1,32($fp) # k3= lw $v0,84($fp) # o addi $v0,$v0,-1 # o-1 lw $a0,32($fp) # k3 lw $a1,4($fp) # j2 add $a2,$0,$v0 # o-1 lw $a3,88($fp) # o0 jal detmin sw $v0,56($fp) # d0= lw $v1,40($fp) # k1 lw $a0,4($fp) # j2 la $a1,A # &A add $v0,$0,$v1 # k1 sll $v0,$v0,1 # k1*2 add $v0,$v0,$v1 # k1*3 add $v0,$v0,$a0 # k1*3+j2 sll $v0,$v0,2 # *4 add $v0,$v0,$a1 # &A[k1][j2] lw $v1,0($v0) # A[k1][j2] lw $v0,56($fp) # d0 mult $v1,$v0 # A[k1][j2]*d0 mflo $v0 sw $v0,52($fp) # d1= lw $v1,44($fp) # k lw $v0,4($fp) # j2 add $v1,$v1,$v0 # k+j2 addi $v0,$0,2 # 2 div $v1,$v0 # HI = (k+j2) % 2 mfhi $v0 sw $v0,64($fp) # s0= lw $v0,64($fp) # s0 beq $v0,$0,espr4# s0==0 --> espr4 addi $v0,$0,-1 sw $v0,60($fp) # s1=-1 j espr3 espr4: addi $v0,$0,1 sw $v0,60($fp) # s1=1 espr3: lw $v0,60($fp) # s1 sw $v0,60($fp) # s1= lw $v1,60($fp) # s1 lw $v0,52($fp) # d1 mult $v1,$v0 # s1*d1 mflo $v0 sw $v0,48($fp) # d2 lw $v1,20($fp) # d lw $v0,48($fp) # d2 add $v0,$v1,$v0 # d+d2 sw $v0,20($fp) # d= lw $v0,44($fp) # k addi $v0,$v0,1 # ++k sw $v0,44($fp) # k= ini_for: lw $v0,44($fp) # k lw $v1,0($fp) # o1 slt $v0,$v0,$v1 # kcorpo_for fine_if: lw $v0,20($fp) # restituisce d add $sp,$0,$fp lw $ra,72($sp) lw $fp,68($sp) addi $sp,$sp,92 j $ra det: addiu $sp,$sp,-28 sw $ra,20($sp) sw $fp,16($sp) sw $s0,12($sp)# salva s0 add $fp,$0,$sp sw $a0,24($fp)# salva o sw $0,8($fp) # i=0 sw $0,0($fp) # d=0 j ini2_for c2_for: lw $v0,8($fp) # i addi $v1,$0,2 # 2 div $v0,$v1 # HI = i % 2 mfhi $v0 sll $v1,$v0,1 # *2 addi $v0,$0,1 # 1 sub $v0,$v0,$v1# 1-... sw $v0,4($fp) # s= lw $v0,8($fp) # i la $a0,A # &A sll $v1,$v0,2 # i*4 sll $v0,$v1,2 # i*16 sub $v0,$v0,$v1 # i*12 (offset di [i][0]) add $v0,$v0,$a0 # &A[i][0] lw $v1,0($v0) # A[i][0] lw $v0,4($fp) # s mult $v1,$v0 # s*A[i][0] mflo $s0 # salva in s0 lw $v0,24($fp) # o addi $v0,$v0,-1 # o-1 lw $a0,8($fp) # i add $a1,$0,$0 # 0 add $a2,$0,$v0 # o-1 lw $a3,24($fp) # o jal detmin mult $s0,$v0 # (detmin)*s*A[i][0] mflo $v1 lw $v0,0($fp) # d add $v0,$v0,$v1 # d+... sw $v0,0($fp) # d= lw $v0,8($fp) # i addiu $v0,$v0,1 # ++i sw $v0,8($fp) # i= ini2_for: lw $v0,8($fp) # i lw $v1,24($fp) # o slt $v0,$v0,$v1 # ic2_for lw $v0,0($fp) # restituisce d add $sp,$0,$fp lw $ra,20($sp)# ripristina ra lw $fp,16($sp)# ripristina fp lw $s0,12($sp)# ripristina s0 addi $sp,$sp,28 # ripristina sp j $ra main: addi $a0, $0, 3 jal det add $s0, $0, $v0 #salva dt la $a0, str addi $v0, $0, 4 syscall # print_string add $a0, $0, $s0 #ripristina dt addi $v0, $0, 1 syscall # print _int addi $v0, $0, 10 syscall # exit