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

questionAnswers(2)

yourAnswerToTheQuestion