# programma: trasformare un array (non vuoto!) in una lista # poi cercare un elemento in questa lista... .data array: .word 3 14 13 8 12 -1 # val negativo: il terminatore della lista inizio_lista: .asciiz "[ " fine_lista: .asciiz " ] " separatore_lista: .asciiz " , " .text la $s0 array # $s0: indirizzo dell'elemento dell'array # per prima cosa costruiamo il PRIMO elemento della lista li $v0 9 li $a0 8 # mi servono OTTO byte syscall # SBRK (syscall con v0 a 9) lw $t1 ($s0) # $t1 = array[0] sw $t1 0($v0) # el.value = $t1 sw $zero 4($v0) # el.next = null move $s3 $v0 # $s3: il PRIMO elemento della lista move $s2 $v0 # $s2 : l'indirizzo dell'ultimo elemento costruito della lista addi $s0 $s0 4 # passo al SECONDO elemento dell'array ciclo: # ciclo di scansione del resto dell'array lw $t1 ($s0) # $t1: elemento corrente dell'array bltz $t1 fineciclo # se $t1 è la guardia, ciclo finito li $v0 9 li $a0 8 # mi servono OTTO byte syscall # SBRK (syscall 9) # ora $v0 contiene l'indirizzo dell'elemento di lista appena allocato sw $t1 0($v0) # (elemento in $v0).value = $t1 sw $zero 4($v0) # (elemento in $v0).next = null sw $v0 4($s2) # (elemento in $s2).next = $v0 move $s2 $v0 addi $s0 $s0 4 # $s0 += 4 (passo al prossimo eleemnto dell'array) j ciclo fineciclo: move $a0 $s3 li $a1 13 jal trova_in_lista move $a0 $v0 jal stampa_lista li $v0 10 syscall # exit # Procedura stampa_lista: stampa una lista data # - Argomenti: $a0 = il primo elemento della lista da stampare # - Valori di ritorno: nessuno stampa_lista: move $t0 $a0 # $t0 : inidrizzo dell'elemento corrente la $a0 inizio_lista li $v0 4 syscall altro_ciclo: beqz $t0 fine_altro_ciclo # se $t0 è null, ho finito lw $a0 ($t0) # a0 = el.value li $v0 1 syscall # stampa $a0 lw $t0 4($t0) # t0 = el.next ---- in C: t0 = t0 -> next la $a0 separatore_lista li $v0 4 syscall j altro_ciclo fine_altro_ciclo: la $a0 fine_lista li $v0 4 syscall jr $ra # funzione trova_in_lista: restituisce l'indirizzo di un elemento # della lista con un dato valore # - ARGOMENTI: $a0: (indirizzo del primo elmento de) la lista # $a1: (valore de) l'elemento da cercare # - VALORI DI RIORNO: # $v0: (indirizzo de) l'elemento della lista trovato # oppure NULL se elemento non trovato trova_in_lista: move $t0 $a0 # t0: (indirizzo dell') elemento corrente della lista altro_ciclo_ancora: beqz $t0 fine_trova lw $t1 ($t0) # t1 = el.value beq $t1 $a1 fine_trova lw $t0 4($t0) # t0 = el.next j altro_ciclo_ancora fine_trova: move $v0 $t0 jr $ra