Реализация соответствия для регулярного выражения '[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

Ответы на вопрос(2)

Ваш ответ на вопрос