# Programma dell'es1 delcompitino del 22/04/2005. .data stra: .asciiz "Inserisci a:" strc: .asciiz "Inserisci c:" strd: .asciiz "Inserisci d:" strz: .asciiz "z=" .text .globl main main: li $v0, 4 # stampa "Inserisci a:" la $a0, stra # syscall # li $v0, 5 # leggi a e mettilo in $s0 syscall move $s0 , $v0 li $v0, 4 # stampa "Inserisci c:" la $a0, strc # syscall # li $v0, 5 # leggi c e mettilo in $s1 syscall move $s1 , $v0 li $v0, 4 # stampa "Inserisci d:" la $a0, strd # syscall # li $v0, 5 # leggi d e mettilo in $s2 syscall # move $s2 , $v0 move $a0 , $s0 # prepara $a0-$a2 per chiamata a somma move $a1 , $s1 move $a2 , $s2 jal somma move $s4 , $v0 # salva z in $s4 li $v0, 4 # stampa "z=" la $a0, strz # syscall # move $a0, $s4 # stampa z li $v0, 1 # syscall # li $v0, 10 # exit syscall # somma: addi $sp , $sp , -8 # Salva nello stack $ra ed $a0 sw $ra , 0($sp) sw $a0 , 4($sp) # b = opera (c ,d) move $a0 , $a1 # prepara gli argomenti per opera move $a1 , $a2 # move rd , rs è una pseudo-istruzione # eq. a addu rd , rs , $zero jal opera # call opera() . # Il risultato è in $v0 al ritorno dalla call. lw $ra , 0($sp) # Rimette a posto $ra ed $a0 lw $a0 , 4($sp) addi $sp , $sp , 8 # Sistema lo stack # z = a + b add $v0 , $a0 , $v0 jr $ra # return alla funzione chiamante. opera: # if (c > d) then b = c - d ; else b = c+d ; bgt $a0 , $a1 , then # c > d ? se si' salta a then # altrimenti continua (else) # pseudo-istruzione equivalente a # slt $at , $a1 , $a0 # bne $at , $zero , then else: add $v0 , $a0 , $a1 # caso else j endif then: sub $v0 , $a0 , $a1 # caso then endif: jr $ra # return alla funzione chiamante.