mam taki kod
#include <stdio.h>
#include <string.h>
int main()
{
char s[] = "aqq b qabxas ryc pqr"; //char *s = "Abcdefg";
char t[100];
asm volatile(
".intel_syntax noprefix;"
"mov ebx,%0;"
"mov ecx, %1;"
"petla:"
"mov al, [ebx];"
"sub al, 0;"
"jz koniec;"
/// sprawdzamy czy jest p albo q albo r ///
"cmp al,0x70;"
"JL nie_dodaj_cx;"
"cmp al,0x72;"
"JG nie_dodaj_cx;" /// koniec warunkuw je¿eli jest [pqr] to zwiêksza cx;
"mov edx,ebx;" /// sprawdzamy czy nast. znak po p albo q albo r jest różny od q albo r...
"inc ebx;"
"mov al, [ebx];"
"cmp al,0x72;"
"je przenies_do_petla;"
"cmp al,0x71;"
"je przenies_do_petla;"
"petla2:" /// petla ktora sprawdza czy dalej nie ma gdzies q, jeżeli jest r to podnosi wartosc cx - znaleziono dopasowanie.
"inc ebx;"
"mov al, [ebx];"
"sub al, 0;"
"jz przenies_do_petla;"
"cmp al,0x71;"
"je przenies_do_petla;"
"cmp al,0x72;"
"jne petla2;"
"jmp wypisz;" /// po napotkaniu pierwszego zgodnego wyrażenia przenosi do wypisywania
"jmp petla2;"
"przenies_do_petla:"
"mov ebx,edx;"
"nie_dodaj_cx:" /// je¿eli nie jest to omija zwiêkszanie i przechodzi dalej czyli zwiêkszenia ebx - iteratora pêtli
"inc ebx;"
"jmp petla;"
"wypisz:"
"call przepiszznak;"
"inc edx;"
"inc ecx;"
"cmp edx, ebx;" /// sprawdzamy czy edx jest mniejsze niż ebx - ilosc znakow do wypisania
"jle wypisz;"
"jmp koniec;"
"przepiszznak:"
"push ax;"
"mov al, [edx];"
"mov [ecx], al;"
"pop ax;"
"ret;"
"koniec:"
".att_syntax prefix;"
:
: "r" (s),"r" (t)
: "ebx", "ecx", "al", "eax", "dx", "ah"
);
printf("wejscie=%s \n\nwyrazenie regularne: \[pqr\]\[^qr\]+r \n=%s \n", s,t);
return 0;
}
Potrzebuje na jutro zrobić wypisywanie z assemblera, a nie przez C. Próbowałem ale nie wychodziło mi. Program pisałem sam więc na pewno rejestry są źle użyte.
Proszę Was o pomoc.