Реализация соответствия для регулярного выражения '[ab] [^ r] + r]' в сборке
Мне нужна помощь с моим кодом сборки. Мне нужно использовать код записи, который найдет диапазон, соответствующий моему выражению регулярного выражения.
Мое регулярное выражение:[ab][^r]+r
, так что сначала я ищу, есть ли «а» или «б» и перейти к разделу «Пуск». Теперь у меня есть проблема, как сохранить только первое вхождение этого письма. Программа должна отображать:5, 10
- это означает, что соответствующая строка начинается с 5 позиций и имеет длину 10. Результат программы, в которой я хочу сохранить'ecx'
а также'edx'
реестры (или я могу упростить это?)
Буду признателен за все предложения и помощь :)
Вот код:
#include <stdio.h>
int main(void)
{
char *s = "fqr b qabxx xryc pqr"; // string length= 22, first occurence: 5 position, second one: 9
int x, y;
asm volatile (
".intel_syntax noprefix;"
"mov eax, %2;"
"xor ecx, ecx;"
"xor edx, edx;"
"lea ebx, [eax];"
"loop:"
"mov al, [ebx];"
"or al, al;"
"jz Finish;"
"inc edx;"
"cmp al, 'a';"
"je Start;"
"cmp al, 'b';"
"je Start;"
"jmp JumpNext;"
"Start:"
"mov ecx, edx;"
"jmp loop;"
"JumpNext:"
"inc ebx;"
"jmp loop;"
"Finish:"
"mov %0, ecx;"
"mov %1, edx;"
".att_syntax prefix;"
:"=r" (x), "=r" (y)
:"r" (s)
:"eax", "ebx", "ecx", "edx"
);
printf("%d, %d \n", x, y);
return 0;
}
РЕДАКТИРОВАТЬ: Вот готовый код:
#include <stdio.h>
int main(void)
{
char *s = "fqr b qabxx xryc pqr";
int x, y;
asm volatile (
".intel_syntax noprefix;"
"xor ecx, ecx;" // First occurrence of letter 'a' or 'b'
"mov edx, 1;" // Matching string length
"lea ebx, [%2];"
"loop:"
"mov al, [ebx];"
"cmp al, 0;"
"jz ThereisNoChars;"
"cmp al, 'a';"
"je FoundAorB;"
"cmp al, 'b';"
"je FoundAorB;"
"inc ecx;"
"inc ebx;"
"jmp loop;"
"FoundAorB:"
"inc ebx;"
"inc edx;"
"mov al, [ebx];"
"or al, al;"
"jz ThereisNoChars;"
"cmp al, 'r';"
"je isRafterAorB;"
"jne ThereIsNoR;"
"isRafterAorB:"
"mov edx, 1;"
"inc ebx;"
"inc ecx;"
"jmp loop;"
"ThereIsNoR:"
"inc ebx;"
"inc edx;"
"mov al,[ebx];"
"or al, al;"
"jz ThereisNoChars;"
"cmp al, 'r';"
"je Finish;"
"jmp ThereIsNoR;"
"ThereisNoChars:"
"mov ecx, 0;"
"mov edx, 0;"
"jmp Finish;"
"Finish:"
"mov %0, ecx;"
"mov %1, edx;"
".att_syntax prefix;"
:"=r" (x), "=r" (y)
:"r" (s)
:"eax", "ebx", "ecx", "edx"
);
printf("%d, %d \n", x, y);
return 0;
}
Отображает ожидаемый результат (5, 10). Это означает, что соответствующее регулярное выражение начинается с 5 позиции и имеет длину 10