# INSERIRE: COGNOME NOME PROFESSORE POSTAZIONE # mcd_ric - una implementazione ricorsiva della funzione mcd(i,j) # che calcola il massimo comun divisore di due interi # con l'algoritmo di Euclide, supposto i > j risulta: # mcd(i,j) = j se i%j == 0 # altrimenti mcd(i,j) = mcd(j,i%j) # ################################################# .text .globl main main: li $a0,27 #primo intero li $a1,15 #secondo intero jal mcd # call mcd move $s0, $v0 la $a0,msg li $v0,4 syscall move $a0,$s0 # stampa risultato li $v0, 1 syscall la $a0,endl li $v0,4 syscall li $v0,10 syscall #fine #------------------------------------------------ # Massimo comun divisore # a0 - primo intero # a1 - secondo intero # v0 - ritorna il risultato #------------------------------------------------ mcd: sub $sp,$sp,12 # salva i registri nello stack sw $a0,0($sp) sw $a1,4($sp) sw $ra,8($sp) divu $a0, $a1 mflo $t1 #quoziente mfhi $t2 #resto bne $t2, $zero, nonzero move $v0,$a1 # i%j == 0 b termina # nonzero: move $a0, $a1 move $a1, $t2 # jal mcd # termina: lw $a0,0($sp) # ripristina registri lw $a1,4($sp) lw $ra,8($sp) add $sp,$sp,12 jr $ra ################################################# .data endl: .asciiz "\n" msg: .asciiz "\nIl valore del m.c.d. e': "