user: 请将这段汇编代码片段转换成等效的C代码:

```asm
<isMatchDP>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %esi,0x8(%rsp)
  mov    %edx,%eax
  imul   %r8d,%eax
  add    %r9d,%eax
  cltq
  mov    0x50(%rsp),%rsi
  lea    (%rsi,%rax,4),%r15
  mov    (%r15),%eax
  cmp    $0xffffffff,%eax
  jne    L46
  mov    %rdi,%r14
  mov    %edx,%ebx
  mov    %rcx,%r13
  mov    %r8d,%r12d
  mov    %r9d,%ebp
  movslq %edx,%rax
  movzbl (%rdi,%rax,1),%eax
  test   %al,%al
  jne    L60
  movslq %r9d,%rax
  cmpb   $0x0,(%rcx,%rax,1)
  je     L38
  cmpb   $0x2a,0x1(%rcx,%rax,1)
  je     L4
  movl   $0x0,(%r15)
  mov    $0x0,%eax
L46:
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L38:
  movl   $0x1,(%r15)
  mov    $0x1,%eax
  jmp    L46
L4:
  sub    $0x8,%rsp
  push   0x58(%rsp)
  lea    0x2(%r9),%r9d
  mov    0x18(%rsp),%esi
  call   <isMatchDP>
  mov    %eax,(%r15)
  add    $0x10,%rsp
  jmp    L46
L60:
  movslq %r9d,%rcx
  movzbl 0x0(%r13,%rcx,1),%edx
  test   %dl,%dl
  je     L21
  cmp    $0x2e,%dl
  je     L103
  cmp    %dl,%al
  je     L103
  cmpb   $0x2a,0x1(%r13,%rcx,1)
  je     L117
  movl   $0x0,(%r15)
  mov    $0x0,%eax
  jmp    L46
L21:
  movl   $0x0,(%r15)
  mov    $0x0,%eax
  jmp    L46
L103:
  cmpb   $0x2a,0x1(%r13,%rcx,1)
  je     L182
  lea    0x1(%rbx),%edx
  sub    $0x8,%rsp
  push   0x58(%rsp)
  lea    0x1(%rbp),%r9d
  mov    %r12d,%r8d
  mov    %r13,%rcx
  mov    0x18(%rsp),%esi
  mov    %r14,%rdi
  call   <isMatchDP>
  mov    %eax,(%r15)
  add    $0x10,%rsp
  jmp    L46
L182:
  lea    0x2(%rbp),%eax
  mov    %eax,0xc(%rsp)
  sub    $0x8,%rsp
  push   0x58(%rsp)
  mov    %eax,%r9d
  mov    %r12d,%r8d
  mov    %r13,%rcx
  mov    %ebx,%edx
  mov    0x18(%rsp),%esi
  mov    %r14,%rdi
  call   <isMatchDP>
  mov    %eax,%edx
  add    $0x10,%rsp
  mov    $0x1,%eax
  test   %edx,%edx
  je     L146
L89:
  mov    %eax,(%r15)
  jmp    L46
L146:
  add    $0x1,%ebx
  sub    $0x8,%rsp
  push   0x58(%rsp)
  mov    %ebp,%r9d
  mov    %r12d,%r8d
  mov    %r13,%rcx
  mov    %ebx,%edx
  mov    0x18(%rsp),%esi
  mov    %r14,%rdi
  call   <isMatchDP>
  mov    %eax,%edx
  add    $0x10,%rsp
  mov    $0x1,%eax
  test   %edx,%edx
  jne    L89
  sub    $0x8,%rsp
  push   0x58(%rsp)
  mov    0x1c(%rsp),%r9d
  mov    %r12d,%r8d
  mov    %r13,%rcx
  mov    %ebx,%edx
  mov    0x18(%rsp),%esi
  mov    %r14,%rdi
  call   <isMatchDP>
  add    $0x10,%rsp
  test   %eax,%eax
  setne  %al
  movzbl %al,%eax
  jmp    L89
L117:
  sub    $0x8,%rsp
  push   0x58(%rsp)
  lea    0x2(%r9),%r9d
  mov    %r13,%rcx
  mov    %ebx,%edx
  mov    0x18(%rsp),%esi
  call   <isMatchDP>
  mov    %eax,(%r15)
  add    $0x10,%rsp
  jmp    L46
```

assistant: ```c
bool isMatchDP(char *s, int sLen, int sIndex, char *p, int pLen, int pIndex, int *isMatchTable) {
  if (isMatchTable[sIndex * pLen + pIndex] != -1)
    return isMatchTable[sIndex * pLen + pIndex];
  if (*(s + sIndex) == '\0') {
    if (*(p + pIndex) == '\0') {
      isMatchTable[sIndex * pLen + pIndex] = 1;
      return 1;
    } else if (*(p + pIndex + 1) == '*') {
      isMatchTable[sIndex * pLen + pIndex] = isMatchDP(s, sLen, sIndex, p, pLen, pIndex + 2, isMatchTable);
      return isMatchTable[sIndex * pLen + pIndex];
    } else {
      isMatchTable[sIndex * pLen + pIndex] = 0;
      return 0;
    }
  } else if (*(p + pIndex) == '\0') {
    isMatchTable[sIndex * pLen + pIndex] = 0;
    return 0;
  } else {
    if (*(s + sIndex) == *(p + pIndex) || *(p + pIndex) == '.') {
      if (*(p + pIndex + 1) == '*') {
        isMatchTable[sIndex * pLen + pIndex] = isMatchDP(s, sLen, sIndex, p, pLen, pIndex + 2, isMatchTable) || isMatchDP(s, sLen, sIndex + 1, p, pLen, pIndex, isMatchTable) || isMatchDP(s, sLen, sIndex + 1, p, pLen, pIndex + 2, isMatchTable);
        return isMatchTable[sIndex * pLen + pIndex];
      } else {
        isMatchTable[sIndex * pLen + pIndex] = isMatchDP(s, sLen, sIndex + 1, p, pLen, pIndex + 1, isMatchTable);
        return isMatchTable[sIndex * pLen + pIndex];
      }
    } else if (*(p + pIndex + 1) == '*') {
      isMatchTable[sIndex * pLen + pIndex] = isMatchDP(s, sLen, sIndex, p, pLen, pIndex + 2, isMatchTable);
      return isMatchTable[sIndex * pLen + pIndex];
    } else {
      isMatchTable[sIndex * pLen + pIndex] = 0;
      return 0;
    }
  }
}
```