uP:Strstr

Z Wiki Rafał (ert16) Trójniak

Spis treści

Temat zadania

Napisz program w testujący w C i program w GAS który znajdzie jeden string wewnątrz drugiego. Oba stringi podane są jako parametry funkcji.

Kody źródłowe

asm.s

#Rafał Trójniak 213347 - zadanie B2
.text
.type is_substring, @function
.global is_substring
#long is_substring(char * string, char * substring, long case_sensitive);
is_substring:
	pushl %ebp
	movl %esp, %ebp
# 	8(%ebp) = string
# 	12(%ebp) = substring
# 	16(%ebp) = cs
 
	mov 8(%ebp), %ebx # string
	mov 12(%ebp), %ecx # substring
	mov 16(%ebp), %edi # cs
 
# Jeśli nieprawidłowe wskaźniki to zawsze zwracaj false
	and %ebx,%ebx
	jz fail
	and %ecx,%ecx
	jz fail
 
# Petla głowna - przechodzi po calym stringu
mainLoop:
	mov %ebx, %esi
	mov %ecx, %edx
 
# Petla wewnetrzna - szuka stringu zaczynającego sie od %ebx
miniloop:
 
#pobieranie wartości do %al i %ah
	movb (%edx), %al
	call minChar
	mov %al, %ah
	lodsb #zamiast mov ($esi), %al
	call minChar
 
# Sprawdzam czy koniec
	and %ah, %ah
	jz success
 
# PRzechodzimy dalej
	inc %edx
 
#Porównanie wartości
	cmp %al, %ah
	je  miniloop
 
# Przechodzimy dalej w dużym stringu
	inc %ebx
# Czy doszliśmy do końca większego stringa ?
	and %al , %al
	jnz mainLoop 
	jmp fail
 
# Udało się znaleźć
success:
	xor %eax, %eax
	inc %eax
	jmp finish
 
#nie udało się
fail :
	xor %eax, %eax
finish:
	movl %ebp, %esp
	popl %ebp
	ret
 
# Podprocedura zmniejszania znaków zawartych w %al
 
minChar:
# Czy mamy sprowadzać do małych liter ?
	and %edi, %edi
	jz minCharEnd
# Sprowadzamy wszystkie znaki do małych liter
	cmpb $'a', %al
	jb minCharEnd
	cmpb $'z', %al
	ja minCharEnd
	xorb $0x20, %al
minCharEnd:
	ret

main.c

/*
 * - Program kompiluje się i działa prawidłowo dla podanych testów
 * - Program jest odporny na podanie wartości 0 jako argumentów
 * */
#include <stdio.h>
 
long is_substring(char * string, char * substring, long case_sensitive);
 
int main()
{
	char * master = "ala ma kota",
		 * sub = "ma",
		 * sub2 = "Ma",
		 * sub3 = "kota",
		 * zly="abc",
		 * zly2="kotal",
		 * zly3="",
		 * zly4=NULL;
	long odp, cs;
	char * arg1, *arg2;
	cs = 0; arg1=master; arg2=sub;
	odp = is_substring(arg1, arg2, cs);
	printf("F(%s, %s, %ld) = %ld\n",arg1, arg2, cs, odp);
 
	cs = 1; arg1=master; arg2=sub;
	odp = is_substring(arg1, arg2, cs);
	printf("F(%s, %s, %ld) = %ld\n",arg1, arg2, cs, odp);
 
	cs = 0; arg1=master; arg2=sub2;
	odp = is_substring(arg1, arg2, cs);
	printf("F(%s, %s, %ld) = %ld\n",arg1, arg2, cs, odp);
 
	cs = 1; arg1=master; arg2=sub2;
	odp = is_substring(arg1, arg2, cs);
	printf("F(%s, %s, %ld) = %ld\n",arg1, arg2, cs, odp);
 
	cs = 0; arg1=master; arg2=sub3;
	odp = is_substring(arg1, arg2, cs);
	printf("F(%s, %s, %ld) = %ld\n",arg1, arg2, cs, odp);
 
	cs = 1; arg1=master; arg2=sub3;
	odp = is_substring(arg1, arg2, cs);
	printf("F(%s, %s, %ld) = %ld\n",arg1, arg2, cs, odp);
 
	cs = 0; arg1=master; arg2=zly;
	odp = is_substring(arg1, arg2, cs);
	printf("F(%s, %s, %ld) = %ld\n",arg1, arg2, cs, odp);
 
	cs = 1; arg1=master; arg2=zly;
	odp = is_substring(arg1, arg2, cs);
	printf("F(%s, %s, %ld) = %ld\n",arg1, arg2, cs, odp);
 
	cs = 0; arg1=master; arg2=zly2;
	odp = is_substring(arg1, arg2, cs);
	printf("F(%s, %s, %ld) = %ld\n",arg1, arg2, cs, odp);
 
	cs = 1; arg1=master; arg2=zly2;
	odp = is_substring(arg1, arg2, cs);
	printf("F(%s, %s, %ld) = %ld\n",arg1, arg2, cs, odp);
 
	cs = 1; arg1=master; arg2=zly3;
	odp = is_substring(arg1, arg2, cs);
	printf("F(%s, %s, %ld) = %ld\n",arg1, arg2, cs, odp);
 
	cs = 1; arg1=zly3; arg2=zly2;
	odp = is_substring(arg1, arg2, cs);
	printf("F(%s, %s, %ld) = %ld\n",arg1, arg2, cs, odp);
 
	cs = 1; arg1=master; arg2=NULL;
	odp = is_substring(arg1, arg2, cs);
	printf("F(%s, %s, %ld) = %ld\n",arg1, arg2, cs, odp);
 
	cs = 1; arg1=NULL; arg2=zly;
	odp = is_substring(arg1, arg2, cs);
	printf("F(%s, %s, %ld) = %ld\n",arg1, arg2, cs, odp);
 
	cs = 1; arg1=zly3; arg2=zly3;
	odp = is_substring(arg1, arg2, cs);
	printf("F(%s, %s, %ld) = %ld\n",arg1, arg2, cs, odp);
	return 0;
}

Odpowiedź programu

F(ala ma kota, ma, 0) = 1
F(ala ma kota, ma, 1) = 1
F(ala ma kota, Ma, 0) = 0
F(ala ma kota, Ma, 1) = 1
F(ala ma kota, kota, 0) = 1
F(ala ma kota, kota, 1) = 1
F(ala ma kota, abc, 0) = 0
F(ala ma kota, abc, 1) = 0
F(ala ma kota, kotal, 0) = 0
F(ala ma kota, kotal, 1) = 0
F(ala ma kota, , 1) = 1
F(, kotal, 1) = 0
F(ala ma kota, (null), 1) = 0
F((null), abc, 1) = 0
F(, , 1) = 1
Osobiste