Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Consigna
- //Un programa recibe por stack la dirección de inicio y el largo de un array (el largo es medido en palabreas de 4 bytes).Su función es
- //poner a cero todos los elementos de ese array cuyos dos bits más significativos son “1” dejando el resto de los elementos de ese
- //array sin alterar. En caso de que ningún elemento de ese arreglo cumpla esa condición el programa escribe el valor D1000160h en el //último de los elementos. La condición citada es evaluada por una rutina a la cual se le pasa por stack el valor a evaluar devolviendo
- //un 1 si la condición se verifica a cero en caso contrario. Esta debe ser declarada en el mismo modulo.
- .begin
- .origin 2048
- .extern caso_sin_resultados
- .macro pop arg
- ld %r14, arg
- add %r14, 4, %r14
- .endmacro
- .macro push arg
- add %r14, -4, %r14
- st arg, %r14
- .endmacro
- pop %r15 !por si viene de otro modulo
- and %r1, %r0, %r1 !Creo un contador inicializado en 0 para calcular la cantidad de cambios realizados
- ld [comparacion], %r11 ! %r11 : 0x00000003
- pop %r2 !r2 : direccion de inicio
- pop %r3 !largo del arreglo
- st %r2, %r9 ! realizo una copia de la direccion inicial
- st %r3, %r10 ! realizo una copia del largo del arreglo
- loop:
- andcc %r3, %r3, %r0 ! descarto el resultado
- be done ! si z=1 entonces ya recorri todo el arreglo
- addcc %r3, -4, %r3 ! Decremento el largo del arreglo
- addcc %r3, %r2, %r4 ! Direccion del proximo elemento
- ld %r4, %r5 ! %r5 : el elemento del arreglo
- sra %r5, 30, %r6 !muevo 30 posiciones a la derecha el valor del arreglo para poder comparar como la consigna
- subcc %r6, %r11, %r0
- be modificar_valor !Si Z=1 entonces r6 y r11 son iguales, es decir que r5 tiene dos 1 en los bits mas significativos
- inc %r1 ! else incremento 1 en el contador
- ba loop
- done:
- subcc %r1, %r13, %r0
- be rutina
- push %r15
- ba fin
- modificar_valores:
- st %r0, %r4 ! En la direccion actual guardo 0x00000000
- ba loop !Regreso directo al loop denuevo(no tengo que sumar uno en el contador)
- rutina:
- push %r9
- push %r10
- call caso_sin_resultados
- pop %r7 ! Devuelvo 1 pq entro en la condicion
- ba fin
- fin:
- push %r15
- jmpl %r15 +4, %r0
- comparacion: 0x00000003
- .end
- -------------------------------------------------------------------------------------------
- .global caso_sin_resultados
- pop %r9
- pop %r10
- ld [uno], %r7
- subcc %r10, %r7, %r10 ! %r10 : posicion final del arreglo (largo-1)
- addcc %r10, %r9, %r4 !%r4 direccion del proximo elemento
- st [valor], %r4 ! Guardo el valor del enunciado en la direccion
- push %r7
- jmpl %r15 + 4, %r0 ! regreso al call
- uno: 0x00000001
- valor: 0xD1000160
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement