Advertisement
camila_dvorkin

Untitled

Jul 1st, 2019
2,103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //Consigna
  2. //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
  3. //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
  4. //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
  5. //un 1 si la condición se verifica a cero en caso contrario. Esta debe ser declarada en el mismo modulo.
  6.  
  7. .begin
  8. .origin 2048
  9. .extern caso_sin_resultados
  10.  
  11. .macro pop arg
  12.     ld %r14, arg
  13.     add %r14, 4, %r14
  14. .endmacro
  15.  
  16. .macro push arg
  17.     add %r14, -4, %r14
  18.     st arg, %r14
  19. .endmacro
  20.  
  21. pop %r15    !por si viene de otro modulo
  22. and %r1, %r0, %r1   !Creo un contador inicializado en 0 para calcular la cantidad de cambios realizados
  23. ld [comparacion], %r11  ! %r11 : 0x00000003
  24.  
  25. pop %r2     !r2 : direccion de inicio
  26. pop %r3     !largo del arreglo
  27. st %r2, %r9     ! realizo una copia de la direccion inicial
  28. st %r3, %r10    ! realizo una copia del largo del arreglo
  29.  
  30. loop:
  31.     andcc %r3, %r3, %r0     ! descarto el resultado
  32.     be done                 ! si z=1 entonces ya recorri todo el arreglo
  33.     addcc %r3, -4, %r3      ! Decremento el largo del arreglo
  34.     addcc %r3, %r2, %r4     ! Direccion del proximo elemento
  35.     ld %r4, %r5             ! %r5 : el elemento del arreglo
  36.    
  37.     sra %r5, 30, %r6        !muevo 30 posiciones a la derecha el valor del arreglo para poder comparar como la consigna
  38.     subcc %r6, %r11, %r0
  39.     be modificar_valor      !Si Z=1 entonces r6 y r11 son iguales, es decir que r5 tiene dos 1 en los bits mas significativos
  40.     inc %r1                 ! else incremento 1 en el contador
  41.     ba loop
  42.  
  43. done:
  44.     subcc %r1, %r13, %r0
  45.     be rutina
  46.     push %r15
  47.     ba fin
  48.  
  49. modificar_valores:
  50.     st %r0, %r4     ! En la direccion actual guardo 0x00000000
  51.     ba loop         !Regreso directo al loop denuevo(no tengo que sumar uno en el contador)
  52.  
  53. rutina:
  54.     push %r9
  55.     push %r10
  56.     call caso_sin_resultados
  57.     pop %r7         ! Devuelvo 1 pq entro en la condicion
  58.     ba fin
  59.  
  60. fin:
  61.     push %r15
  62.     jmpl %r15 +4, %r0
  63.  
  64.  
  65. comparacion:    0x00000003
  66. .end
  67. -------------------------------------------------------------------------------------------
  68. .global caso_sin_resultados
  69.     pop %r9
  70.     pop %r10
  71.     ld [uno], %r7
  72.     subcc %r10, %r7, %r10     ! %r10 : posicion final del arreglo (largo-1)
  73.     addcc %r10, %r9, %r4      !%r4 direccion del proximo elemento
  74.     st [valor], %r4           ! Guardo el valor del enunciado en la direccion
  75.     push %r7
  76.     jmpl %r15 + 4, %r0      ! regreso al call
  77.  
  78. uno: 0x00000001
  79. valor: 0xD1000160
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement