Problema 4 - MIPS: programació en assemblador, ru… · Estructura i tecnologia de computadors II UDG Juny

Tema: MIPS: programació en assemblador, rutines i pila · Del examen Juny

Enunciado

Problema 4.- Comptador d'arbres en MIPS

Es vol desenvolupar una aplicació per a l'emulador SPIM de MIPS per comptabilitzar el nombre de píxels que corresponen a vegetació/arbres en una imatge de satèl·lit.

Es disposa prèviament d'una subrutina auxiliar amb la capçalera següent:

# bool segmentaPixel (pixel: int)

# Adreça de la rutina: segmentaPixel

# Paràmetres: $a0: valor del píxel que volem segmentar (paraula de 32 bits)

# Retorn: $v0: 1 si és arbre, 0 si no és arbre.

b)

Desenvolupeu el programa principal (funció main) en assemblador MIPS que recorri tota la imatge, invoqui la subrutina segmentaPixel per a cada píxel, comptabilitzi quants en són arbres i imprimeixi per consola el missatge acompanyat del valor total. Respecteu escrupolosament el conveni de registres MIPS (preservació de registres callee-save a la pila).

Enunciado: Problema 4 - MIPS: programació en assemblador, ru… · Estructura i tecnologia de computadors II UDG Juny

Solución

Según los criterios oficiales de corrección

b. Desenvolupeu el programa principal (funció main ) en assemblador MIPS que recorri tota la imatge

Solución: ```python .globl main main: # Reserva d'espai a la pila per preservar registres (20 bytes) subu sp,sp,sp, 20 sw ra,0(ra, 0(sp) # Adreça de retorn sw s0,4(s0, 4(sp) # $s0: nombre total de píxels sw s1,8(s1, 8(sp) # $s1: índex / comptador de bucle (i) sw s2,12(s2, 12(sp) # $s2: acumulador de píxels d'arbre sw s3,16(s3, 16(sp) # $s3: adreça base de la imatge la $s3, Image # Carrega l'adreça de la imatge lhu \t0, Width # \t0 = 192 lhu \t1, Height # \t1 = 144 mul s0,s0,t0, \t1 # \s0 = total_pixels = 192 * 144 li $s1, 0 # i = 0 li $s2, 0 # num_arbres = 0 for: beq s1,s1,s0, fi # Si i == total_pixels, sortir del bucle sll t0,t0,s1, 2 # Desplaçament en bytes: offset = i * 4 add t0,t0,s3, $t0 # Adreça del píxel actual: &Image[i] lw a0,0(a0, 0(t0) # Carrega el píxel a $a0 com a argument jal segmentaPixel # Crida a la rutina de segmentació add s2,s2,s2, $v0 # num_arbres += resultat (v0) addi s1,s1,s1, 1 # i++ j for fi: # Impressió del text de resultat li $v0, 4 # Syscall print_string la $a0, Resultat syscall # Impressió del valor enter acumulat li $v0, 1 # Syscall print_int move a0,a0,s2 syscall # Restauració dels registres des de la pila lw ra,0(ra, 0(sp) lw s0,4(s0, 4(sp) lw s1,8(s1, 8(sp) lw s2,12(s2, 12(sp) lw s3,16(s3, 16(sp) addu sp,sp,sp, 20 jr $ra # Retorn al sistema operatiu ```

La explicación paso a paso, hecha con IA, es Premium. Premium

Resuélvelo aquí mismo: corrección automática, pistas y solución paso a paso.

‹ Pregunta 21 · Exemples · Pregunta 21 · Juny ›

Más ejercicios de MIPS: programació en assemblador, rutines i pila