Implementando um Matcher para a Regex '[ab] [^ r] + r]' no assembly
Preciso de ajuda com meu código de montagem. Preciso usar código de gravação, que encontre o intervalo, adequado à minha expressão regex.
Meu regex:[ab][^r]+r
, primeiro, estou procurando se há 'a' ou 'b' e pule para a seção 'Iniciar'. Agora eu tenho um problema como salvar apenas a primeira ocorrência desta carta. O programa deve exibir:5, 10
- significa que a sequência correspondente começa na posição 5 e tem 10 comprimento. Resultado do programa que eu quero salvar em'ecx'
e'edx'
registros (ou posso simplificá-lo?)
Gostaria muito de receber todas as sugestões e ajuda :)
Aqui está um código:
#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;
}
EDIT: Aqui está um código finalizado:
#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;
}
Exibe o resultado esperado (5, 10). Isso significa que o regex correspondente começa na posição 5 e tem 10 comprimento