Advertisement
Guest User

Untitled

a guest
Jan 18th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.27 KB | None | 0 0
  1. .section startup
  2. .org 0
  3. jmp main
  4.  
  5.  
  6. .data
  7. ;/****** multiply ******/
  8. multiplicand: .byte 0
  9. multiplier: .byte 0
  10.  
  11.  
  12. ;variáveis a ser usadas para 'restaurar' o valor guardado em cada uma delas pois vai ser 'estragado' no decorrimento do programa
  13. multiply_r2: .word
  14. multiply_r3: .word
  15. multiply_r4: .word
  16.  
  17.  
  18. ;variáveis a ser usadas para 'restaurar' o valor guardado em cada uma delas pois vai ser 'estragado' no decorrimento do programa
  19. mul_array_r0: .word
  20. mul_array_r1: .word
  21. mul_array_r4: .word
  22. mul_array_r5: .word
  23.  
  24.  
  25. ;/********************************************/
  26. price: .byte 12,15,25,57,200
  27. tax1: .byte 5,10,23,10,23
  28. amount1: .space 10 ;reserva o espaço em unidades de byte, por isso o espaço tem de ser 2x o valor que queremos (5*2)
  29. tax2: .byte 6,12,24,12
  30. amount2: .space 8 ;reserva o espaço em unidades de byte, por isso o espaço tem de ser 2x o valor que queremos (4*2)
  31.  
  32.  
  33.  
  34. .text
  35.  
  36. main:
  37. ldi r0,#low(price)
  38. ldih r0,#high(price)
  39. ldi r1,#low(tax1)
  40. ldih r1,#high(tax1)
  41. ldi r2,#low(amount1)
  42. ldih r2,#high(amount1)
  43. ldi r3,#5
  44. jmpl mul_array
  45.  
  46. ldi r0,#low(tax2)
  47. ldih r0,#high(tax2)
  48. ldi r1,#low(price)
  49. ldih r1,#high(price)
  50. ldi r2,#low(amount2)
  51. ldih r2,#high(amount2)
  52. ldi r3,#4
  53. jmpl mul_array
  54.  
  55. jmp $
  56.  
  57. ;/****************************** multiply **************************************/
  58.  
  59. ; b) A quantidade de memória de código ocupada pela rotina implementada é dada pelo seguinte cálculo: 0030 - 000C = 0024 ,ou seja 36 bytes.
  60.  
  61. ; c) Para calcular o número de ciclos máquina gastos na função conta-se todos os ld’s e st’s multiplicando o seu total por 4 (porque tem que ir a memoria) no final e contar todas as outras instruções e multiplicar por 1.
  62. ; Ou seja, (5*4) + (33*1) = 53. O numero de ciclos máquina gastos na função é de 53!
  63.  
  64.  
  65. multiply:
  66. ;guardar cada valor dos registos nas variáveis correspondentes pois vao ser "estragados"
  67. st r2, multiply_r2
  68. st r3, multiply_r3
  69. st r4, multiply_r4
  70.  
  71. ldi r2,#0 ;result = 0
  72. ldih r2,#0
  73. ldi r3,#0
  74. ldih r3,#0
  75. add r3,r3,r0 ;m = multiplicand
  76. ldi r4,#0; ;i = 0
  77.  
  78. for_multiply:
  79. add r1,r1,#0
  80. jz exit
  81. shr r6,r1,#1,0 ;é feito o 'and' com o auxilio de um shift right e guardado em r6 apenas para principios de flag (carry)
  82. jc if ;caso exista 'carry', ou seja, aconteça o and e portanto !=0 é possível prosseguir para o if
  83.  
  84. if_end:
  85. shr r1,r1,#1,0
  86. shl r3,r3,#1,0
  87. inc r4
  88. jmp for_multiply
  89.  
  90. if:
  91. add r2,r2,r3 ;result+=m
  92. jmp if_end
  93. jmp for_multiply
  94.  
  95. exit:
  96. mov r0,r2 ; é movido o conteudo do registo 2 para o registo 0 pois é este que apresenta o retorno das funçoes
  97. ld r2, multiply_r2 ; antes do 'ret' os registos sao 'restaurados' com os valores anteriormente guardados
  98. ld r3, multiply_r3
  99. ld r4, multiply_r4
  100. ret
  101.  
  102.  
  103. ;/************************************ mul_array ******************************/
  104.  
  105. mul_array:
  106. st r5, mul_array_r5 ;Guardar o valor do registo 5 porque vai ser estragado nesta funçao, e nao é parametro
  107. st r4, mul_array_r4 ;Guardar o valor do registo 4 porque vai ser estragado nesta funçao, e nao é parametro
  108. ldi r4, #0 ;int i = 0 -> r4
  109.  
  110.  
  111.  
  112. for_mul_array:
  113. sub r6, r4, r3 ; i - size -> i<size
  114. jnc for_end ;salta para fora do "for" se nao der borrow, ou seja, i=size ou i>size
  115.  
  116. ; Dentro do for
  117. st r0, mul_array_r0 ;guardar o r0 porque vai ser estragado quando for chamado a funçao multiply()
  118. st r1, mul_array_r1 ; guardar o r1 porque vai ser estragado quando for chamado a funçao multiply()
  119. ldb r0, [r0,r4] ; r0 = a[i]
  120. ldb r1, [r1, r4] ; r1 = b[i]
  121. jmpl multiply
  122. st r0, [r2,r4] ; c[i] = r0 -> que é o resultado do multiply
  123. ld r0, mul_array_r0 ; repor no r0 o valor que foi guardado de a
  124. ld r1, mul_array_r1 ; repor no r1 o valor que foi guardado de b
  125. inc r4 ; i++
  126. jmp for_mul_array
  127.  
  128. for_end:
  129. ld r4, mul_array_r4 ; repor o valor original de r4 que foi guardado no inicio da funçao, ou seja, i=0
  130. ld r5, mul_array_r5 ; repor o valor original de r5 que foi guardado no inicio da funçao
  131. ret
  132.  
  133.  
  134. .end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement