user: 下面的汇编指令对应的C源代码是什么:

```asm
<string_match>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %edx,-0x34(%rbp)
  cmpq   $0x0,-0x30(%rbp)
  je     L98
  mov    -0x30(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L222
L98:
  mov    $0x0,%eax
  jmp    L400
L222:
  mov    -0x30(%rbp),%rax
  lea    D5(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L397
  mov    $0x1,%eax
  jmp    L400
L397:
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x14(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x10(%rbp)
  mov    -0x10(%rbp),%eax
  cltq
  lea    -0x1(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  mov    %al,-0x15(%rbp)
  mov    -0x30(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2a,%al
  jne    L324
  cmpb   $0x2a,-0x15(%rbp)
  je     L324
  mov    -0x10(%rbp),%eax
  sub    $0x1,%eax
  cmp    %eax,-0x14(%rbp)
  jge    L401
  mov    $0x0,%eax
  jmp    L400
L401:
  cmpl   $0x0,-0x34(%rbp)
  je     L213
  mov    -0x30(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x14(%rbp),%eax
  cltq
  mov    -0x10(%rbp),%ecx
  movslq %ecx,%rcx
  sub    %rcx,%rax
  lea    0x1(%rax),%rcx
  mov    -0x28(%rbp),%rax
  add    %rcx,%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L228
L213:
  cmpl   $0x0,-0x34(%rbp)
  jne    L348
  mov    -0x30(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x14(%rbp),%eax
  cltq
  mov    -0x10(%rbp),%ecx
  movslq %ecx,%rcx
  sub    %rcx,%rax
  lea    0x1(%rax),%rcx
  mov    -0x28(%rbp),%rax
  add    %rcx,%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <string_strcasecmp@plt>
  test   %rax,%rax
  jne    L348
L228:
  mov    $0x1,%eax
  jmp    L400
L348:
  mov    $0x0,%eax
  jmp    L400
L324:
  mov    -0x30(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2a,%al
  je     L153
  cmpb   $0x2a,-0x15(%rbp)
  jne    L153
  mov    -0x10(%rbp),%eax
  sub    $0x1,%eax
  cmp    %eax,-0x14(%rbp)
  jge    L116
  mov    $0x0,%eax
  jmp    L400
L116:
  cmpl   $0x0,-0x34(%rbp)
  je     L130
  mov    -0x10(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    -0x30(%rbp),%rcx
  mov    -0x28(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L380
L130:
  cmpl   $0x0,-0x34(%rbp)
  jne    L125
  mov    -0x10(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    -0x30(%rbp),%rcx
  mov    -0x28(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <string_strncasecmp@plt>
  test   %rax,%rax
  jne    L125
L380:
  mov    $0x1,%eax
  jmp    L400
L125:
  mov    $0x0,%eax
  jmp    L400
L153:
  mov    -0x30(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2a,%al
  jne    L311
  cmpb   $0x2a,-0x15(%rbp)
  jne    L311
  mov    -0x10(%rbp),%eax
  sub    $0x1,%eax
  cmp    %eax,-0x14(%rbp)
  jge    L352
  mov    $0x0,%eax
  jmp    L400
L352:
  mov    -0x10(%rbp),%eax
  lea    -0x2(%rax),%edx
  mov    -0x30(%rbp),%rax
  add    $0x1,%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <string_strndup@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  jne    L230
  mov    $0x0,%eax
  jmp    L400
L230:
  cmpl   $0x0,-0x34(%rbp)
  je     L346
  mov    -0x8(%rbp),%rdx
  mov    -0x28(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstr@plt>
  test   %rax,%rax
  jne    L135
L346:
  cmpl   $0x0,-0x34(%rbp)
  jne    L117
  mov    -0x8(%rbp),%rdx
  mov    -0x28(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <string_strcasestr@plt>
  test   %rax,%rax
  je     L117
L135:
  mov    $0x1,%eax
  jmp    L314
L117:
  mov    $0x0,%eax
L314:
  mov    %eax,-0xc(%rbp)
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0xc(%rbp),%eax
  jmp    L400
L311:
  cmpl   $0x0,-0x34(%rbp)
  je     L226
  mov    -0x30(%rbp),%rdx
  mov    -0x28(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L204
L226:
  cmpl   $0x0,-0x34(%rbp)
  jne    L411
  mov    -0x30(%rbp),%rdx
  mov    -0x28(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <string_strcasecmp@plt>
  test   %rax,%rax
  jne    L411
L204:
  mov    $0x1,%eax
  jmp    L400
L411:
  mov    $0x0,%eax
L400:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: label: D5
type_guessed: string

tool: D5: *

assistant: ```c
int string_match(const char *string, const char *mask, int case_sensitive) {
  char last, *mask2;
  int len_string, len_mask, rc;
  if (!mask || !mask[0])
    return 0;
  if (strcmp(mask, "*") == 0)
    return 1;
  len_string = strlen(string);
  len_mask = strlen(mask);
  last = mask[len_mask - 1];
  if ((mask[0] == '*') && (last != '*')) {
    if (len_string < len_mask - 1)
      return 0;
    if ((case_sensitive && (strcmp(string + len_string - (len_mask - 1), mask + 1) == 0)) || (!case_sensitive && (string_strcasecmp(string + len_string - (len_mask - 1), mask + 1) == 0)))
      return 1;
    return 0;
  }
  if ((mask[0] != '*') && (last == '*')) {
    if (len_string < len_mask - 1)
      return 0;
    if ((case_sensitive && (strncmp(string, mask, len_mask - 1) == 0)) || (!case_sensitive && (string_strncasecmp(string, mask, len_mask - 1) == 0)))
      return 1;
    return 0;
  }
  if ((mask[0] == '*') && (last == '*')) {
    if (len_string < len_mask - 1)
      return 0;
    mask2 = string_strndup(mask + 1, len_mask - 2);
    if (!mask2)
      return 0;
    rc = ((case_sensitive && strstr(string, mask2)) || (!case_sensitive && string_strcasestr(string, mask2))) ? 1 : 0;
    free(mask2);
    return rc;
  }
  if ((case_sensitive && (strcmp(string, mask) == 0)) || (!case_sensitive && (string_strcasecmp(string, mask) == 0)))
    return 1;
  return 0;
}
```