Witam.
Ostatnio na studiach mamy początki asemblera i ćwiczeniowiec zlecił nam wykonanie programu.
Ale do rzeczy
Mam do napisania program który liczy ilość wystąpień łańcucha y w łańcuchu x.
Muszę oczywiście wyprowadzić wynik za pomocą wywołania systemowego, ale tym zajmę się później...
Do rzeczy. Napisałem program i najzwyczajniej w świecie nie działa.
Czy ktoś mógłby mi pomóc?
Oto kod :
#include <stdio.h>
int main() {
char *x="abcabab_xxabc"; //0
char *y="ab"; //1
int i=0;
//char bufor[4];
asm (
".intel_syntax noprefix;" /* składnia intel */
"mov ecx, %1;"
"push ecx;"
"mov ecx, %0;"
"mov ebx,%2;"
"call zadanie1;"
"jmp wyjscie;"
"zadanie1:"
"push ebp;"
"mov ebp,esp;"
"push ecx;"
"push ebx;"
"push eax;"
"push edx;"
"mov eax,[ebp+8];" //do rejestru wrzucamy wartosc y bo tak go ustawilismy na stosie
"mov edx,[ebp-4];" //do edx wrzucamy wartosc x
"xor cx,cx;" //wyzerowanie licznika
//NAJPIERW SPRAWDZAMY CZY KTORYS Z ŁANCUCHOW NIE JEST PUSTY, LUB OBA NIE SA PUSTE
"cmp [eax],[edx];"
"jz dodajlicznikizakoncz;"
"jnz przeskoczjeslinierowne;" //-
//|
"dodajlicznikizakoncz:" //|
"inc cx;" //| jesli ktorys z nich nie jest pusty
"jmp koniec;" //|
//|
"przeskoczjeslinierowne:" //-
"cmp [eax],byte ptr 0;"
"jz koniec;"
"cmp [edx],byte ptr 0;"
"jz koniec;"
///////////////////////////////////////////////////////////////////////////////////////
"jmp sprawdz;"
"jeslirowne:"
"inc eax;"
"cmp [eax],byte ptr 0;"
"jz wrocdopoczatku;"
"jmp przesunedx;"
"przesunedx:"
"inc edx;"
"cmp [edx],byte ptr 0;"
"jz koniec;"
"jmp sprawdz:"
"wrocdopoczatku:"
"mov eax,[ebp+8];"
"inc cx;"
"jmp przesunedx;"
"sprawdz;"
"mov bl,[eax];"
"cmp bl,[edx];"
"jz jeslirowne;"
"jnz przesunedx:"
"koniec:"
"mov %2,cx;"
"pop edx;"
"pop eax;"
"pop ebx;"
"pop ecx;"
"pop ebp;"
"ret 8;"
"wyjscie:"
".att_syntax prefix;"
:"r" (i)
:"r" (x),"r" (y)
:"ebx","ecx"
);
printf("y=%hd \n",i);
return 0;
}