Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .data # sekcja danych
- plik_1:
- .space 100
- .align 4
- plik_2:
- .space 100
- .align 4
- plik_WY: # plik wyjściowy
- .asciiz "efekt.bmp"
- .align 4
- komunikat_1:
- .asciiz "\nPodaj wspolrzedna x miejsca wstawienia obrazka: "
- .align 4
- komunikat_2:
- .asciiz "\nPodaj wspolrzedna y miejsca wstawienia obrazka: "
- .align 4
- komunikat_3:
- .asciiz "\nPodaj stopien przezroczystosci mniejszego obrazka (w zakresie 0-256): "
- .align 4
- komunikat_4:
- .asciiz "\nPodaj sciezke obrazka wiekszego (/home/nowak/obrazek.bmp): "
- .align 4
- komunikat_5:
- .asciiz "\nPodaj sciezke obrazka mniejszego (/home/kowal/rysunek.bmp): "
- .align 4
- komunikat_err:
- .asciiz "\nPrzekroczono wymiary obrazka !"
- .align 4
- naglowek_1: # bufor do przechowywania nagłówka pierwszego pliku bmp
- .space 124
- .align 4
- naglowek_2: # bufor do przechowywania nagłówka drugiego pliku bmp
- .space 124
- .align 4
- .text # sekcja kodu
- # PLIK 1
- # pobranie ścieżki do pliku pierwszego
- li $v0,4
- la $a0,komunikat_4 # WYSWIETLAMY PIERWSZY KOMUNIKAT
- syscall
- li $v0,8
- la $a0,plik_1
- li $a1,100
- syscall
- la $t0, plik_1
- # ucięcie ścieżki, tak aby nie było entera (z enterem ścieka wczytuje się nieporawnie)
- l:
- lb $t1,($t0)
- beqz $t1,zamien_1
- add $t0,$t0,1
- j l
- zamien_1:
- sub $t0,$t0,1
- sb $t1,($t0)
- # otwarcie pliku do odczytu
- li $v0, 13
- la $a0, plik_1
- li $a1, 0
- li $a2, 0
- syscall
- move $s6, $v0
- # odczyt i zapis nagłówka z pliku bmp
- # zaczynam wczytywanie do bufora od jego trzeciego bajtu, żeby szerokość znalazła się pod adresem podzielnym przez 4
- li $v0, 14
- move $a0, $s6
- la $a1, naglowek_1+2
- li $a2, 122
- syscall
- # zamknięcie pliku
- # li $v0, 16
- # move $a0, $s6
- # syscall
- # wysłuskanie informacji o szerokości i wysokości obrazka
- lw $s2,naglowek_1+20 # s2 szerokość obrazka
- lw $s3,naglowek_1+24 # s3 wysokość obrazka
- lw $s1,naglowek_1+4 # s1 rozmiar alokowanych danych
- la $s4,($s2)
- mul $s4,$s4,3
- andi $s4,$s4,3
- # alokacja pamęci na dane (dane = informacje o nasyceniu kolorów w każdym pikselu)
- li $v0,9
- move $a0,$s1
- syscall
- move $s0,$v0 # s0 rejestr z adresem pocżatku danych
- # ponowne otwarcie pliku do odczytu
- # li $v0, 13
- # la $a0, plik_1
- # li $a1, 0
- # li $a2, 0
- # syscall
- # move $s6, $v0
- # odczyt i zapis danych
- li $v0, 14
- move $a0, $s6
- la $a1, ($s0)
- la $a2, ($s1)
- syscall
- # zamkniecie pliku
- li $v0, 16
- move $a0, $s6
- syscall
- # PLIK 2 - analogiczne operacje
- # pobranie ścieżki do pliku pierwszego
- li $v0,4
- la $a0,komunikat_5
- syscall
- li $v0,8
- la $a0,plik_2
- li $a1,100
- syscall
- la $t0, plik_2
- # ucięcie ścieżki, tak aby nie było entera (z enterem ścieka wczytuje się nieporawnie)
- l_2:
- lb $t1,($t0)
- beqz $t1,zamien_2
- add $t0,$t0,1
- j l_2
- zamien_2:
- sub $t0,$t0,1
- sb $t1,($t0)
- # otwarcie pliku do odczytu
- li $v0, 13
- la $a0, plik_2
- li $a1, 0
- li $a2, 0
- syscall
- move $s6, $v0
- # odczyt i zapis nagłówka z pliku bmp
- li $v0, 14
- move $a0, $s6
- la $a1, naglowek_2+2
- li $a2, 122
- syscall
- # zamknięcie pliku
- # li $v0, 16
- # move $a0, $s6
- # syscall
- # wysłuskanie informacji o szerokości i wysokości obrazka
- lw $t2,naglowek_2+20 # t2 szerokość
- lw $t3,naglowek_2+24 # t3 wysokość
- lw $t1,naglowek_1+4 # t1 rozmiar alokowanych danych
- la $t4,($t2)
- mul $t4,$t4,3
- andi $t4,$t4,3
- # alokacja pamęci na dane (informacje o nasyceniu kolorów w każdym pikselu)
- li $v0,9
- move $a0,$t1
- syscall
- move $t0,$v0 # t0 adres pocżatku danych
- # otwarcie pliku do odczytu
- # li $v0, 13
- # la $a0, plik_2
- # li $a1, 0
- # li $a2, 0
- # syscall
- # move $s6, $v0
- # odczyt i zapis danych
- li $v0, 14
- move $a0, $s6
- la $a1, ($t0)
- la $a2, ($t1)
- syscall
- # zamkniecie pliku
- li $v0, 16
- move $a0, $s6
- syscall
- ###############################################################
- # wczytanie pozycji gdzie stawić obrazek
- li $v0,4
- la $a0, komunikat_1
- syscall
- li $v0, 5
- syscall
- la $t8,($v0)
- la $a3,($s2)
- sub $a3,$a3,$t2
- bge $t8,$a3,err
- # tutaj jest ucięcie rozmiaru, jeśli obraz "wychodzi" poza tło
- # szerokość (pozycja x)
- # dodatkowo dla szerokości zapis ile bitów ucięto
- la $a3,($t8)
- add $a3,$a3,$t2
- bgt $a3,$s2,change
- li $t1,0
- j no_change
- change:
- la $t1,($t8)
- add $t1,$t1,$t2
- sub $t1,$t1,$s2
- mul $t1,$t1,3
- la $t2,($s2)
- sub $t2,$t2,$t8
- no_change:
- # wysokość (pozycja y)
- li $v0,4
- la $a0, komunikat_2
- syscall
- li $v0, 5
- syscall
- la $t7,($v0)
- la $a3,($s3)
- sub $a3,$a3,$t3
- bge $t7,$a3,err
- bge $t7,$a3,err
- la $t7,($v0)
- la $a3,($t7)
- add $a3,$a3,$t3
- bgt $a3,$s3,change_2
- li $t1,0
- j no_change_2
- change_2:
- la $t3,($s3)
- sub $t3,$t3,$t7
- no_change_2:
- # tworzę nowy plik bmp
- # otwarcie pliku do zapisu
- li $v0, 13
- la $a0, plik_WY
- li $a1, 1
- li $a2, 0
- syscall
- move $s6, $v0
- li $v0, 15
- move $a0, $s6
- la $a1, naglowek_1+2
- la $a2, 122
- syscall
- # obliczam ile bajtów mam do wczytania na samym począku
- la $t9,($t7)
- mul $t9,$t9,$s2
- mul $t9,$t9,3
- li $s5,4
- sub $s5,$s5,$s4
- beq $s5,4,endLoop_A
- loop_A:
- beqz $s5,endLoop_A
- sub $s5,$s5,1
- add $t9,$t9,$t7
- j loop_A
- endLoop_A:
- # add $t9,$t9,122
- # zapis do pliku bmp początkowych wierszy, które nie ulegają zmianie
- li $v0, 15
- move $a0, $s6
- la $a1, ($s0)
- la $a2, ($t9)
- syscall
- add $s0,$s0,$t9
- # add $t0,$t0,122
- la $t9,($t3)
- # pętla w której wczytuje wiersze wymagające zmiany
- loop_EMC:
- # wczytanie bajtów które się nie zmienią w tym wierszu
- li $v0, 15
- move $a0, $s6
- la $a1, ($s0)
- la $a2, ($t8)
- mul $a2,$a2,3
- syscall
- add $s0,$s0,$t8
- add $s0,$s0,$t8
- add $s0,$s0,$t8
- la $t5,($t2)
- mul $t5,$t5,3
- li $s1,256
- sub $s1,$s1,$s7
- # pętla która wstawia zmienione bajty
- loop_in_loop_EMC:
- lbu $t6,($t0)
- lbu $a3,($s0)
- mul $t6,$t6,$s1
- srl $t6,$t6,8
- mul $a3,$a3,$s7
- srl $a3,$a3,8
- add $t6,$t6,$a3
- sb $t6,($t0)
- li $v0, 15
- move $a0, $s6
- la $a1, ($t0)
- li $a2, 1
- syscall
- subi $t5,$t5,1
- add $t0,$t0,1
- add $s0,$s0,1
- beqz $t5, continue_EMC
- j loop_in_loop_EMC
- # zapis pozostałych bajtów w danym wierszu które się nie zmienią (może być ich 0)
- continue_EMC:
- #Padding (w przypadku nierówności u mniejszego obrazka)
- li $s5,4
- sub $s5,$s5,$t4
- beq $s5,4,endLoop_B
- loop_B:
- beqz $s5,endLoop_B
- sub $s5,$s5,1
- add $t0,$t0,1
- j loop_B
- endLoop_B:
- #Padding
- add $t0,$t0,$t1
- li $v0, 15
- move $a0, $s6
- la $a1, ($s0)
- la $a2, ($s2)
- sub $a2,$a2,$t8
- sub $a2,$a2,$t2
- mul $a2,$a2,3
- #Padding
- li $s5,4
- sub $s5,$s5,$s4
- beq $s5,4,endLoop_D
- loop_D:
- beqz $s5,endLoop_D
- sub $s5,$s5,1
- add $a2,$a2,1
- j loop_D
- endLoop_D:
- #Padding
- syscall
- subi $t9,$t9,1
- beqz $t9, end_EMC
- add $s0,$s0,$a2
- j loop_EMC
- end_EMC:
- # wczytanie pozostalych wierszy, które się nie zmienią (może być ich 0)
- add $s0,$s0,$a2
- li $v0, 15
- move $a0, $s6
- la $a1, ($s0)
- la $a2, ($s3)
- sub $a2,$a2,$t7
- sub $a2,$a2,$t3
- la $a3,($a2)
- mul $a2, $a2,$s2
- #Padding
- li $s5,4
- sub $s5,$s5,$s4
- beq $s5,4,endLoop_C
- loop_C:
- beqz $s5,endLoop_C
- sub $s5,$s5,1
- add $a2,$a2,$a3
- j loop_C
- endLoop_C:
- #Padding
- mul $a2, $a2, 3
- syscall
- j FINAL
- FINAL:
- # zamknięcie pliku
- li $v0, 16
- move $a0, $s6
- syscall
- # koniec programu
- li $v0,10
- syscall
- # komunikat błędu
- err:
- li $v0, 4
- la $a0, komunikat_err
- syscall
- li $v0,10
- syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement