Advertisement
Guest User

wstawianie

a guest
Apr 25th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.         .data       # sekcja danych      
  2. plik_1:        
  3.     .space 100    
  4.        .align 4
  5. plik_2:        
  6.     .space 100
  7.        .align 4
  8. plik_WY:        # plik wyjściowy
  9.     .asciiz "efekt.bmp"      
  10.        .align 4
  11. komunikat_1:
  12.     .asciiz "\nPodaj wspolrzedna x miejsca wstawienia obrazka: "
  13.     .align 4
  14. komunikat_2:
  15.     .asciiz "\nPodaj wspolrzedna y miejsca wstawienia obrazka: "   
  16.        .align 4
  17. komunikat_3:
  18.     .asciiz "\nPodaj stopien przezroczystosci mniejszego obrazka (w zakresie 0-256): " 
  19.        .align 4
  20. komunikat_4:
  21.     .asciiz "\nPodaj sciezke obrazka wiekszego (/home/nowak/obrazek.bmp): "
  22.     .align 4
  23. komunikat_5:
  24.     .asciiz "\nPodaj sciezke obrazka mniejszego (/home/kowal/rysunek.bmp): "   
  25.        .align 4
  26. komunikat_err:
  27.     .asciiz "\nPrzekroczono wymiary obrazka !" 
  28.        .align 4
  29. naglowek_1:         # bufor do przechowywania nagłówka pierwszego pliku bmp
  30.     .space 124
  31.     .align 4
  32. naglowek_2:         # bufor do przechowywania nagłówka drugiego pliku bmp
  33.     .space 124
  34.     .align 4
  35.  
  36.     .text       # sekcja kodu
  37.  
  38. # PLIK 1
  39. # pobranie ścieżki do pliku pierwszego
  40.   li $v0,4
  41.   la $a0,komunikat_4 # WYSWIETLAMY PIERWSZY KOMUNIKAT
  42.   syscall
  43.   li $v0,8
  44.   la $a0,plik_1
  45.   li $a1,100
  46.   syscall
  47.   la $t0, plik_1
  48.  
  49. # ucięcie ścieżki, tak aby nie było entera (z enterem ścieka wczytuje się nieporawnie)
  50. l:
  51.   lb $t1,($t0)
  52.   beqz $t1,zamien_1
  53.   add $t0,$t0,1
  54.   j l
  55. zamien_1:
  56.   sub $t0,$t0,1  
  57.   sb $t1,($t0)
  58.    
  59. # otwarcie pliku do odczytu
  60.   li   $v0, 13      
  61.   la   $a0, plik_1    
  62.   li   $a1, 0      
  63.   li   $a2, 0        
  64.   syscall      
  65.   move $s6, $v0
  66.      
  67. # odczyt i zapis nagłówka z pliku bmp
  68. # zaczynam wczytywanie do bufora od jego trzeciego bajtu, żeby szerokość znalazła się pod adresem podzielnym przez 4
  69.   li   $v0, 14      
  70.   move $a0, $s6      
  71.   la   $a1, naglowek_1+2  
  72.   li   $a2, 122  
  73.   syscall
  74.  
  75. # zamknięcie pliku
  76. #  li   $v0, 16      
  77. #  move $a0, $s6      
  78. #  syscall
  79.  
  80. # wysłuskanie informacji o szerokości i wysokości obrazka
  81.   lw $s2,naglowek_1+20  # s2 szerokość obrazka
  82.   lw $s3,naglowek_1+24  # s3 wysokość obrazka
  83.   lw $s1,naglowek_1+4   # s1 rozmiar alokowanych danych
  84.   la $s4,($s2)
  85.   mul $s4,$s4,3
  86.   andi $s4,$s4,3
  87.    
  88. # alokacja pamęci na dane (dane = informacje o nasyceniu kolorów w każdym pikselu)
  89.   li $v0,9
  90.   move $a0,$s1
  91.   syscall
  92.   move $s0,$v0      # s0 rejestr z adresem pocżatku danych
  93.  
  94. # ponowne otwarcie pliku do odczytu
  95. #  li   $v0, 13      
  96. #  la   $a0, plik_1    
  97. #  li   $a1, 0      
  98. #  li   $a2, 0        
  99. #  syscall            
  100. #  move $s6, $v0      
  101.  
  102. # odczyt i zapis danych
  103.   li   $v0, 14      
  104.   move $a0, $s6      
  105.   la   $a1, ($s0)  
  106.   la   $a2, ($s1)  
  107.   syscall          
  108.  
  109. # zamkniecie pliku
  110.   li   $v0, 16      
  111.   move $a0, $s6    
  112.   syscall        
  113.  
  114. # PLIK 2 - analogiczne operacje
  115. # pobranie ścieżki do pliku pierwszego
  116.   li $v0,4
  117.   la $a0,komunikat_5
  118.   syscall
  119.   li $v0,8
  120.   la $a0,plik_2
  121.   li $a1,100
  122.   syscall
  123.   la $t0, plik_2
  124.  
  125. # ucięcie ścieżki, tak aby nie było entera (z enterem ścieka wczytuje się nieporawnie)  
  126. l_2:
  127.   lb $t1,($t0)
  128.   beqz $t1,zamien_2
  129.   add $t0,$t0,1
  130.   j l_2
  131. zamien_2:
  132.   sub $t0,$t0,1  
  133.   sb $t1,($t0)
  134.  
  135. # otwarcie pliku do odczytu    
  136.   li   $v0, 13      
  137.   la   $a0, plik_2    
  138.   li   $a1, 0      
  139.   li   $a2, 0        
  140.   syscall            
  141.   move $s6, $v0      
  142.  
  143. # odczyt i zapis nagłówka z pliku bmp    
  144.   li   $v0, 14      
  145.   move $a0, $s6      
  146.   la   $a1, naglowek_2+2  
  147.   li   $a2, 122      
  148.   syscall
  149.  
  150. # zamknięcie pliku
  151. # li   $v0, 16      
  152. # move $a0, $s6      
  153. # syscall
  154.  
  155. # wysłuskanie informacji o szerokości i wysokości obrazka  
  156.   lw $t2,naglowek_2+20  # t2 szerokość
  157.   lw $t3,naglowek_2+24  # t3 wysokość
  158.   lw $t1,naglowek_1+4   # t1 rozmiar alokowanych danych
  159.   la $t4,($t2)
  160.   mul $t4,$t4,3
  161.   andi $t4,$t4,3
  162.  
  163. # alokacja pamęci na dane (informacje o nasyceniu kolorów w każdym pikselu)
  164.   li $v0,9
  165.   move $a0,$t1
  166.   syscall
  167.   move $t0,$v0      # t0 adres pocżatku danych
  168.  
  169. # otwarcie pliku do odczytu
  170. # li   $v0, 13      
  171. # la   $a0, plik_2
  172. # li   $a1, 0      
  173. # li   $a2, 0        
  174. # syscall            
  175. # move $s6, $v0      
  176.  
  177. # odczyt i zapis danych
  178.   li   $v0, 14      
  179.   move $a0, $s6      
  180.   la   $a1, ($t0)  
  181.   la   $a2, ($t1)
  182.   syscall          
  183.  
  184. # zamkniecie pliku
  185.   li   $v0, 16      
  186.   move $a0, $s6    
  187.   syscall
  188.  
  189. ###############################################################
  190. # wczytanie pozycji gdzie stawić obrazek
  191.   li $v0,4
  192.   la $a0, komunikat_1
  193.   syscall
  194.   li $v0, 5
  195.   syscall
  196.   la $t8,($v0)
  197.   la $a3,($s2)
  198.   sub $a3,$a3,$t2
  199.   bge $t8,$a3,err  
  200.  
  201. # tutaj jest ucięcie rozmiaru, jeśli obraz "wychodzi" poza tło
  202. # szerokość (pozycja x)
  203. # dodatkowo dla szerokości zapis ile bitów ucięto
  204.   la $a3,($t8)
  205.   add $a3,$a3,$t2
  206.   bgt $a3,$s2,change
  207.   li $t1,0
  208.   j no_change
  209. change:
  210.   la $t1,($t8)
  211.   add $t1,$t1,$t2
  212.   sub $t1,$t1,$s2
  213.   mul $t1,$t1,3
  214.   la $t2,($s2)
  215.   sub $t2,$t2,$t8
  216. no_change:
  217.  
  218. # wysokość (pozycja y)
  219.   li $v0,4
  220.   la $a0, komunikat_2
  221.   syscall
  222.   li $v0, 5
  223.   syscall
  224.   la $t7,($v0)
  225.  
  226.   la $a3,($s3)
  227.   sub $a3,$a3,$t3
  228.   bge $t7,$a3,err
  229.  
  230.   bge $t7,$a3,err  
  231.   la $t7,($v0)
  232.   la $a3,($t7)
  233.   add $a3,$a3,$t3
  234.   bgt $a3,$s3,change_2
  235.   li $t1,0
  236.   j no_change_2
  237. change_2:
  238.   la $t3,($s3)
  239.   sub $t3,$t3,$t7
  240. no_change_2:
  241.  
  242. # tworzę nowy plik bmp
  243. # otwarcie pliku do zapisu
  244.   li   $v0, 13      
  245.   la   $a0, plik_WY    
  246.   li   $a1, 1      
  247.   li   $a2, 0        
  248.   syscall            
  249.   move $s6, $v0
  250.  
  251.   li $v0, 15
  252.   move $a0, $s6
  253.   la   $a1, naglowek_1+2
  254.   la   $a2, 122
  255.   syscall
  256.      
  257. # obliczam ile bajtów mam do wczytania na samym począku
  258.   la $t9,($t7)
  259.   mul $t9,$t9,$s2
  260.   mul $t9,$t9,3
  261.  
  262.   li $s5,4
  263.   sub $s5,$s5,$s4
  264.   beq $s5,4,endLoop_A
  265. loop_A:
  266.   beqz $s5,endLoop_A
  267.   sub $s5,$s5,1
  268.   add $t9,$t9,$t7
  269.   j loop_A
  270. endLoop_A:
  271.  
  272.  # add $t9,$t9,122
  273.    
  274. # zapis do pliku bmp początkowych wierszy, które nie ulegają zmianie
  275.   li $v0, 15
  276.   move $a0, $s6
  277.   la   $a1, ($s0)
  278.   la   $a2, ($t9)
  279.   syscall
  280.   add $s0,$s0,$t9
  281. # add $t0,$t0,122
  282.   la $t9,($t3)
  283.  
  284.  
  285. # pętla w której wczytuje wiersze wymagające zmiany
  286. loop_EMC:
  287. # wczytanie bajtów które się nie zmienią w tym wierszu
  288.   li $v0, 15
  289.   move $a0, $s6
  290.   la   $a1, ($s0)
  291.   la   $a2, ($t8)
  292.   mul  $a2,$a2,3
  293.   syscall
  294.   add $s0,$s0,$t8  
  295.   add $s0,$s0,$t8  
  296.   add $s0,$s0,$t8
  297.   la $t5,($t2)
  298.   mul $t5,$t5,3
  299.   li $s1,256
  300.   sub $s1,$s1,$s7
  301.      
  302. # pętla która wstawia zmienione bajty  
  303. loop_in_loop_EMC:  
  304.   lbu $t6,($t0)
  305.   lbu $a3,($s0)
  306.   mul $t6,$t6,$s1
  307.   srl $t6,$t6,8
  308.   mul $a3,$a3,$s7
  309.   srl $a3,$a3,8
  310.   add $t6,$t6,$a3
  311.   sb $t6,($t0)
  312.   li $v0, 15
  313.   move $a0, $s6
  314.   la   $a1, ($t0)
  315.   li   $a2, 1
  316.   syscall
  317.   subi $t5,$t5,1
  318.   add $t0,$t0,1
  319.   add $s0,$s0,1
  320.   beqz $t5, continue_EMC
  321.   j loop_in_loop_EMC
  322.  
  323. # zapis pozostałych bajtów w danym wierszu które się nie zmienią (może być ich 0)
  324. continue_EMC:
  325.  
  326. #Padding (w przypadku nierówności u mniejszego obrazka)
  327.   li $s5,4
  328.   sub $s5,$s5,$t4
  329.   beq $s5,4,endLoop_B
  330. loop_B:
  331.   beqz $s5,endLoop_B
  332.   sub $s5,$s5,1
  333.   add $t0,$t0,1
  334.   j loop_B
  335. endLoop_B:
  336. #Padding
  337.  
  338.   add $t0,$t0,$t1
  339.   li $v0, 15
  340.   move $a0, $s6
  341.   la   $a1, ($s0)
  342.   la   $a2, ($s2)
  343.   sub $a2,$a2,$t8
  344.   sub $a2,$a2,$t2
  345.   mul  $a2,$a2,3
  346.  
  347. #Padding
  348.   li $s5,4
  349.   sub $s5,$s5,$s4
  350.   beq $s5,4,endLoop_D
  351. loop_D:
  352.   beqz $s5,endLoop_D
  353.   sub $s5,$s5,1
  354.   add $a2,$a2,1
  355.   j loop_D
  356. endLoop_D:
  357. #Padding
  358.  
  359.   syscall
  360.   subi $t9,$t9,1
  361.   beqz $t9, end_EMC
  362.   add $s0,$s0,$a2
  363.  
  364.   j loop_EMC
  365.  
  366. end_EMC:
  367. # wczytanie pozostalych wierszy, które się nie zmienią (może być ich 0)
  368.   add $s0,$s0,$a2
  369.   li $v0, 15
  370.   move $a0, $s6
  371.   la   $a1, ($s0)
  372.   la   $a2, ($s3)
  373.   sub  $a2,$a2,$t7  
  374.   sub  $a2,$a2,$t3
  375.   la $a3,($a2)
  376.   mul  $a2, $a2,$s2
  377.  
  378. #Padding
  379.   li $s5,4
  380.   sub $s5,$s5,$s4
  381.   beq $s5,4,endLoop_C
  382. loop_C:
  383.   beqz $s5,endLoop_C
  384.   sub $s5,$s5,1
  385.   add $a2,$a2,$a3
  386.   j loop_C
  387. endLoop_C:
  388. #Padding
  389.  
  390.   mul  $a2, $a2, 3
  391.   syscall
  392.   j FINAL
  393.  
  394. FINAL:  
  395. # zamknięcie pliku
  396.   li   $v0, 16      
  397.   move $a0, $s6      
  398.   syscall
  399.  
  400. # koniec programu  
  401.   li $v0,10
  402.   syscall
  403.  
  404. # komunikat błędu
  405. err:
  406.   li   $v0, 4      
  407.   la $a0, komunikat_err  
  408.   syscall
  409.   li $v0,10
  410.   syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement