findpattern.s.txt

(6 KB) Pobierz
		.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
		
Zgłoś jeśli naruszono regulamin