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