.data pimg: .asciiz "pimg.bmp" # nazwa pliku ptrn: .asciiz "ptrn.bmp" # nazwa pliku ok: .asciiz "Znalazlem: " nope: .asciiz "Nie znalazlem." space: .asciiz " " slad: .asciiz "Jest slad!\n" .text .globl main main: # otwieranie pliku wzoru li $v0, 13 # syscall 13 (open file) la $a0, ptrn # nazwa pliku li $a1, 0 # flagi li $a2, 0 # mode syscall # otwieranie move $s0, $v0 # zapisanie deskryptora # wsadzanie headera na stos li $v0, 14 # syscall 14 (read file) move $a0, $s0 # deskryptor addiu $sp, -54 # make room on stack move $a1, $sp # bufor li $a2, 54 # dlugosc syscall # zapis do pamieci # czytanie danych o wzorcu ulw $s2, 18($sp) # szerokosc ulw $s3, 22($sp) # wysokosc ulw $s4, 2($sp) # rozmiar ulw $s5, 10($sp) # offset tablicy addiu $sp, 54 # czyszczenie stosu sll $s2, $s2, 16 # przesuniecie szerokosci w lewo o 16b addu $s2, $s2, $s3 # zapisanie wymiarow w wymaganym formacie # alokacja miejsca na plik zrodla li $v0, 9 # syscall 9 (sbrk) move $a0, $s4 # miejsce na plik syscall move $s3, $v0 # zapis wskaznika li $v0, 14 # syscall 14 (read) move $a0, $s0 # deskryptor wzorca move $a1, $s3 # bufor move $a2, $s4 # miejce na tablice syscall # zapis pliku #addu $s3, $s3, $t5 # przesuniecie wskaznika na tablice addiu $s3, $s3, -1 # bez tego nie dziala # zamykanie pliku li $v0, 16 # syscall 16 (close file) move $a0, $s0 # deskryptor syscall # zamykanie # otwieranie pliku zrodla li $v0, 13 # syscall 13 (open file) la $a0, pimg # nazwa pliku li $a1, 0 # flagi li $a2, 0 # mode syscall # otwieranie move $s1, $v0 # zapisanie deskryptora # alokacja struktury Point li $v0, 9 # syscall 9 (sbrk) li $a0, 8 # 2 x INT syscall move $s4, $v0 # zapis wskaznika # podawanie argumentow move $a0, $s4 move $a1, $s3 move $a2, $s2 move $a3, $s1 FindPattern: move $s7, $a0 # Point* pResult move $s0, $a1 # int* ptrn move $s2, $a2 # int pSize move $t8, $a3 # ImgDesc* Imgx sll $s3, $s2, 16 # pobranie xwmax srl $s3, $s3, 16 # wyrownanie ywmax srl $s2, $s2, 16 # wyrownanie xwmax # czytanie pliku zrodla li $v0, 14 # system call code for read file move $a0, $t8 # file descriptor addiu $sp, -54 # make room on stack move $a1, $sp # buffer li $a2, 54 # length syscall # read # czytanie danych o zrodle ulw $s4, 18($sp) # width ulw $s5, 22($sp) # height ulw $t4, 10($sp) # bitmap offset ulw $t5, 2($sp) # rozmiar pliku ulw $s6, 28($sp) # bity na piksel srl $a3, $s6, 3 # bajty na piksel addiu $sp, 54 # clear stack # obliczenie paddingu w obu plikach # obliczane przez operacje: # (4 - xwmax %4) %4 # mulou $v1, $s2, $a3 # xwmax w bajtach li $t9, 4 sll $t6, $v1, 30 # xwmax % 4 srl $t6, $t6, 30 # % 4 cd. subu $t6, $t9, $t6 # 4 - pad % 4 sll $t6, $t6, 30 # % 4 srl $t6, $t6, 30 # % 4 cd. mulou $v1, $s4, $a3 # xzmax w bajtach sll $t7, $v1, 30 # xzmax % 4 srl $t7, $t7, 30 # % 4 cd. subu $t7, $t9, $t7 # 4 - pad % 4 sll $t7, $t7, 30 # % 4 srl $t7, $t7, 30 # % 4 cd. # alokacja miejsca na plik zrodla li $v0, 9 # syscall 9 (sbrk) move $a0, $t5 # alokacja miejdca na plik syscall move $s1, $v0 # zapis zp* li $v0, 14 # syscall 14 (read) move $a0, $t8 # deskryptor z move $a1, $s1 # bufor zp* move $a2, $t5 # miejce na tablice syscall #addu $s1, $s1, $t4 # przesuniecie wskaznika na tablice addiu $s1, $s1, -1 # bez tego nie dziala # inicjalizacja zmiennych do petli move $t2, $zero move $t3, $zero move $t4, $zero move $t5, $zero #mulou $t6, $t6, $a3 # padding w bajtach #mulou $t7, $t7, $a3 # padding w bajtach # calkowite przesuniecie przy # przechodzeniu do kolejnego wiersza # padding + szerokosc wzorca -1 subu $s4, $s4, $s2 # xzmax = xzmax - xwmax subu $s5, $s5, $s3 # yzmax = yzmax - ywmax mulou $a2, $a3, $s4 # xzmax * Bpp (roznica szerokosci obrazow w bajtach) addu $a2, $a2, $t7 # uzupelnienie o padding w bajtach addiu $s4, $s4, 1 # xzmax++ addiu $s5, $s5, 1 # yzmax++ # przesuniecie wzgledem calego slowa li $t8, 32 # stala 32 subu $t9, $t8, $s6 # obliczenie przesuniecia (np. 32 - 24) # s0 wp # wskaznik aktualnego bitu wzorca # s1 zp # wskaznik aktualnego bitu zrodla # s2 xwmax # szerokosc wzorca # s3 ywmax # wysokosc wzorca # s4 xzmax # # s5 yzmax # s6 bpp # s7 pResult # # t0 w # t1 z # t2 xw # t3 yw # t4 xz # t5 yz # t6 pw # t7 pz # t8 tmp # t9 przesuniecie # # a0 tmp # a1 tmp # a2 xwmax * Bpp # a3 Bpp ######################### # petle # ######################### loop_1: move $t0, $s0 # w = wp wartosc poczatkowa move $t1, $s1 # z = zp podbita wartosc startowa beq $t5, $s5, exit_bad # if(yz == yzmax) wychodzimy, nie znaleziono bne $t4, $s4, loop_2 # if(xz != xzmax) nie ma konca linii, wchodzimy do petli 2 addu $s1, $s1, $t7 # zp* = zp* + pz addiu $t5, $t5, 1 # yz++ przechodzimy do nastepnej linii move $t4, $zero # xz = 0 zerowanie x zrodla, liczymy od poczatku linii move $t0, $s0 # w* = wp* move $t1, $s1 # z* = zp* loop_2: bne $t2, $s2, cmp # if(xw != xwmax) nie ma konca linii, sprawdzamy piksele addiu $t3, $t3, 1 # yw++ nastepna linia beq $t3, $s3, exit_good # if(yw == ywmax) przeszukalismy caly wzorzec, wychodzimy, znaleziono addu $t0, $t0, $t6 # w* = w* + pw addu $t1, $t1, $a2 # przejscie z z* do nastepnej linii move $t2, $zero # zerowanie x wzorca, liczymy od poczatku linii cmp: ulw $a0, ($t0) # pobranie 32 bitow z w* ulw $a1, ($t1) # pobranie 32 bitow z z* srlv $a0, $a0, $t9 # przesuniecie w prawo srlv $a1, $a1, $t9 # przesuniecie w prawo bne $a0, $a1, bump_1 # if(*z != *p) podbijamy petle 1 bump_2: addu $t0, $t0, $a3 # w* = w* + bpp addu $t1, $t1, $a3 # z* = z* + bpp addiu $t2, $t2, 1 # xw++ b loop_2 ################# bump_1: li $v0, 4 la $a0, slad syscall addu $s1, $s1, $a3 # zp* = zp* + bpp addiu $t4, $t4, 1 # xz++ b loop_1 exit_good: addiu $t4, $t4, 1 subu $t5, $s5, $t5 li $v0, 4 la $a0, ok syscall li $v0, 1 move $a0, $t4 syscall li $v0, 4 la $a0, space syscall li $v0, 1 move $a0, $t5 syscall sw $t4, ($s7) # ladowanie wyniku do pResult.x sw $t5, 4($s7) # ladowanie wyniku do pResult.y move $v0, $s7 li $v0, 10 syscall exit_bad: li $v0, 4 la $a0, nope syscall li $v0, 10 syscall
jaktoma