/MedianaElka/inside.asm

http://github.com/fiedukow/MedianaElka · Assembly · 103 lines · 94 code · 9 blank · 0 comment · 0 complexity · 55e2bce353f5e7c75a8c1efa0bc99b3d MD5 · raw file

  1. addiu $sp, $sp, -36
  2. move $t1, $sp
  3. li $t4,0
  4. li $t3,0
  5. li $t2,0
  6. li $t8,0
  7. li $t5,0
  8. # t0 - poczatek fragmentu stosu, skad czytamy (obszar pamieci zawierajacy 3 wczytane z pliku linie)
  9. # t1 - poczatek fragmentu stosu, gdzie piszemy (obszar pamieci zarezerwowany na wyliczenie jasnosci 9 pixeli)
  10. read_9pixel_loop:
  11. beq $t2,3,read_9pixel_loop_end
  12. read_3pixel_loop:
  13. beq $t3,3,read_3pixel_loop_end
  14. read_3bytes_loop:
  15. beq $t4,3,read_3bytes_loop_end
  16. li $t8,3
  17. mult $t8,$t3
  18. mflo $t8
  19. addu $t7,$t0,$t8
  20. mult $s6,$t2
  21. mflo $t8
  22. addu $t7,$t7,$t8 # przesuniecie wynikajace z wiersza bitmapy
  23. #addu $t7,$t7,$t0
  24. addu $t7,$t7,$t4 # dodajemy do adresu pobranych danych offset wynikaj¹cy z kroku pêtli
  25. lb $t9, 0($t7) # pobieramy odpowiedni kolor (R, G albo B)
  26. andi $t9,$t9,0x000000ff # nakladamy maske na odczytany bit, poniewaz lb nie gwarantuje nam co sie stanie z pozostala czescia slowa (dopelnia jedynkami), co mogloby nam popsuc dodawanie (obliczanie brightness'a)
  27. addu $t6, $t6, $t9 # dodajemy brightness (R+G+B)
  28. addiu $t4,$t4,1 # czytaj kolejny bajt
  29. j read_3bytes_loop
  30. read_3bytes_loop_end:
  31. li $t8,4
  32. mult $t5, $t8
  33. mflo $t8
  34. sll $t4, $t5, 16 # przesuwamy wartosc offsetu na drugi starszy bajt, zeby moc go nastepnie zsumowac z jasnoscia (ID pixela z kratki)
  35. addu $t6,$t6,$t4
  36. li $t4,0 # przygotuj licznik petli read_3bytes_loop do kolejnego wejscia
  37. addu $t7,$t1,$t8 # dodajemy do adresu pobranych danych offset wynikaj¹cy z obiegu pêtli
  38. sw $t6,0($t7) # zapisz odczytany brightness pixela (pixel = 3 bajty, brightness = B+B+B = 2B)
  39. li $t6,0 # wyczysc brightness, tak zeby moc wyliczyc go dla nowego pixela w nastepnym obiegu petli
  40. addiu $t3,$t3,1 # kolejny obieg petli
  41. addiu $t5,$t5,1 # zapamietujemy ogolny offset dla zapisywanych danych
  42. j read_3pixel_loop
  43. read_3pixel_loop_end:
  44. li $t3, 0 # przygotuj licznik petli read_3pixel_loop do kolejnego wejscia
  45. addiu $t2,$t2,1 # kolejny obieg petli
  46. j read_9pixel_loop
  47. read_9pixel_loop_end:
  48. ## t2-t9 - FREE
  49. # process brightness (sort + find mediana)
  50. # t2,t3 loops markers
  51. li $t2,0
  52. ls: #sort by brightness for mediana (on stack)
  53. bge $t2,9,ls_end
  54. li $t3,0
  55. lsin:
  56. bge $t3,9,lsin_end
  57. mul $t6,$t3,4
  58. addu $t6,$t1,$t6
  59. lhu $t4,0($t6)
  60. lhu $t5,4($t6)
  61. bgt $t5, $t4, skip_swap
  62. lb $t7,2($t6)
  63. sll $t7,$t7,16
  64. and $t4,$t4,$t7
  65. lb $t7,6($t6)
  66. sll $t7,$t7,16
  67. and $t5,$t5,$t7
  68. sw $t5,0($t6)
  69. sw $t4,4($t6)
  70. skip_swap:
  71. addiu $t3,$t3,1
  72. j lsin
  73. lsin_end:
  74. addiu $t2,$t2,1
  75. j ls
  76. ls_end:
  77. lb $t2, 18($t1) #tmp mediana id
  78. addiu $sp,$sp,36 # zwalniamy stos na brigthnessy