.data # Array con spazio extra alla fine (lo zero finale fa da "cuscinetto" per l'elemento shiftato) array: .word 10, 20, 30, 40, 0 dim: .word 4 # Dimensione logica attuale dell'array val: .word 99 # Valore da inserire pos: .word 2 # Indice in cui inserire (0-based) .text .globl main main: la $t0, array # Indirizzo base dell'array lw $t1, dim # Carico la dimensione lw $t2, pos # Carico la posizione di inserimento lw $t3, val # Carico il valore da inserire # Calcolo l'indirizzo dell'ultimo elemento corrente (indice dim - 1) addi $t4, $t1, -1 # t4 = dim - 1 sll $t4, $t4, 2 # Moltiplico per 4 (ogni word occupa 4 byte) add $t5, $t0, $t4 # t5 = Indirizzo dell'ultimo elemento # Calcolo l'indirizzo della posizione in cui inserire sll $t6, $t2, 2 # Moltiplico l'indice 'pos' per 4 add $t6, $t0, $t6 # t6 = Indirizzo esatto in cui dovra' andare il 99 loop_shift_right: blt $t5, $t6, fine_shift # Se il puntatore scende sotto la pos di inserimento, fine shift # --- COMPLETA QUI (Blocco 1) --- # Obiettivo: Traslare l'elemento corrente verso destra. # Inserisci le tue istruzioni qui: # ------------------------------- addi $t5, $t5, -4 # Arretro il puntatore all'elemento precedente j loop_shift_right fine_shift: # --- COMPLETA QUI (Blocco 2) --- # Obiettivo: Inserire il nuovo valore nella posizione ormai liberata. # Inserisci la tua istruzione qui: # ------------------------------- # Aggiorno la dimensione logica dell'array in memoria addi $t1, $t1, 1 sw $t1, dim # Terminazione corretta del programma li $v0, 10 syscall