user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<trio_match_case>:
  endbr64
  push   %r15
  push   %r14
  mov    %rdi,%r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0xa8,%rsp
  mov    %rdi,0x78(%rsp)
  mov    %rsi,0x88(%rsp)
  call   <assert@plt>
  mov    %rbx,%rdi
  call   <assert@plt>
  movzbl (%rbx),%eax
  cmp    $0x2a,%al
  je     L388
  mov    %rbx,%rcx
  mov    %r14,%rdx
  jmp    L118
L147:
  cmp    %al,%sil
  je     L998
  cmp    $0x3f,%al
  jne    L314
L998:
  movzbl 0x1(%rcx),%eax
  add    $0x1,%rcx
  add    $0x1,%rdx
  cmp    $0x2a,%al
  je     L406
L118:
  movzbl (%rdx),%esi
  test   %sil,%sil
  jne    L147
  test   %al,%al
  sete   %al
  movzbl %al,%eax
L627:
  add    $0xa8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L406:
  mov    %rdx,0x78(%rsp)
  mov    %rcx,0x88(%rsp)
L388:
  mov    0x88(%rsp),%rax
  cmpb   $0x2a,0x1(%rax)
  jne    L392
L469:
  add    $0x1,%rax
  cmpb   $0x2a,0x1(%rax)
  je     L469
  mov    %rax,0x88(%rsp)
L392:
  mov    0x88(%rsp),%rax
  add    $0x1,%rax
  mov    %rax,0x98(%rsp)
L65:
  mov    0x78(%rsp),%r14
  mov    %r14,%rdi
  call   <assert@plt>
  mov    0x98(%rsp),%rbx
  mov    %rbx,%rdi
  call   <assert@plt>
  mov    0x88(%rsp),%rax
  movzbl 0x1(%rax),%eax
  cmp    $0x2a,%al
  je     L993
  mov    %rbx,%rcx
  mov    %r14,%rdx
  jmp    L498
  nopl   (%rax)
L235:
  cmp    $0x3f,%al
  je     L856
  cmp    %al,%sil
  jne    L414
L856:
  movzbl 0x1(%rcx),%eax
  add    $0x1,%rcx
  add    $0x1,%rdx
  cmp    $0x2a,%al
  je     L959
L498:
  movzbl (%rdx),%esi
  test   %sil,%sil
  jne    L235
  test   %al,%al
  je     L262
L414:
  addq   $0x1,0x78(%rsp)
  mov    0x78(%rsp),%rax
  cmpb   $0x0,-0x1(%rax)
  jne    L65
L314:
  xor    %eax,%eax
  jmp    L627
  nopl   (%rax)
L262:
  mov    $0x1,%eax
  jmp    L627
L959:
  mov    %rcx,0x70(%rsp)
  mov    %rcx,%rax
  mov    %rdx,0x58(%rsp)
L516:
  cmpb   $0x2a,0x1(%rax)
  jne    L892
L470:
  add    $0x1,%rax
  cmpb   $0x2a,0x1(%rax)
  je     L470
  mov    %rax,0x70(%rsp)
L892:
  mov    0x70(%rsp),%rax
  add    $0x1,%rax
  mov    %rax,0x90(%rsp)
L453:
  mov    0x58(%rsp),%r14
  mov    %r14,%rdi
  call   <assert@plt>
  mov    0x90(%rsp),%rbx
  mov    %rbx,%rdi
  call   <assert@plt>
  mov    0x70(%rsp),%rax
  movzbl 0x1(%rax),%eax
  cmp    $0x2a,%al
  je     L56
  mov    %rbx,%rcx
  mov    %r14,%rdx
  jmp    L792
  nopl   0x0(%rax,%rax,1)
L936:
  cmp    $0x3f,%al
  je     L853
  cmp    %al,%sil
  jne    L420
L853:
  movzbl 0x1(%rcx),%eax
  add    $0x1,%rcx
  add    $0x1,%rdx
  cmp    $0x2a,%al
  je     L888
L792:
  movzbl (%rdx),%esi
  test   %sil,%sil
  jne    L936
  test   %al,%al
  je     L262
L420:
  addq   $0x1,0x58(%rsp)
  mov    0x58(%rsp),%rax
  cmpb   $0x0,-0x1(%rax)
  jne    L453
  jmp    L414
L888:
  mov    %rcx,0x60(%rsp)
  mov    %rcx,%rax
  mov    %rdx,0x40(%rsp)
L823:
  cmpb   $0x2a,0x1(%rax)
  jne    L329
L439:
  add    $0x1,%rax
  cmpb   $0x2a,0x1(%rax)
  je     L439
  mov    %rax,0x60(%rsp)
L329:
  mov    0x60(%rsp),%rax
  add    $0x1,%rax
  mov    %rax,0x80(%rsp)
L299:
  mov    0x40(%rsp),%r14
  mov    %r14,%rdi
  call   <assert@plt>
  mov    0x80(%rsp),%rbx
  mov    %rbx,%rdi
  call   <assert@plt>
  mov    0x60(%rsp),%rax
  movzbl 0x1(%rax),%eax
  cmp    $0x2a,%al
  je     L462
  mov    %rbx,%rsi
  mov    %r14,%rcx
  jmp    L376
L748:
  cmp    %al,%dl
  je     L750
  cmp    $0x3f,%al
  jne    L905
L750:
  movzbl 0x1(%rsi),%eax
  add    $0x1,%rsi
  add    $0x1,%rcx
  cmp    $0x2a,%al
  je     L206
L376:
  movzbl (%rcx),%edx
  test   %dl,%dl
  jne    L748
  test   %al,%al
  je     L262
L905:
  addq   $0x1,0x40(%rsp)
  mov    0x40(%rsp),%rax
  cmpb   $0x0,-0x1(%rax)
  jne    L299
  jmp    L420
L206:
  mov    %rsi,0x50(%rsp)
  mov    %rsi,%rax
  mov    %rcx,0x28(%rsp)
L509:
  cmpb   $0x2a,0x1(%rax)
  jne    L916
L669:
  add    $0x1,%rax
  cmpb   $0x2a,0x1(%rax)
  je     L669
  mov    %rax,0x50(%rsp)
L916:
  mov    0x50(%rsp),%rax
  add    $0x1,%rax
  mov    %rax,0x68(%rsp)
L289:
  mov    0x28(%rsp),%rbx
  mov    %rbx,%rdi
  call   <assert@plt>
  mov    0x68(%rsp),%rbp
  mov    %rbp,%rdi
  call   <assert@plt>
  mov    0x50(%rsp),%rax
  movzbl 0x1(%rax),%eax
  cmp    $0x2a,%al
  je     L952
  mov    %rbx,%rdx
  jmp    L881
  nopl   (%rax)
L772:
  cmp    $0x3f,%al
  je     L429
  cmp    %al,%cl
  jne    L978
L429:
  movzbl 0x1(%rbp),%eax
  add    $0x1,%rbp
  add    $0x1,%rdx
  cmp    $0x2a,%al
  je     L551
L881:
  movzbl (%rdx),%ecx
  test   %cl,%cl
  jne    L772
  test   %al,%al
  je     L262
L978:
  addq   $0x1,0x28(%rsp)
  mov    0x28(%rsp),%rax
  cmpb   $0x0,-0x1(%rax)
  jne    L289
  jmp    L905
L551:
  mov    %rdx,0x10(%rsp)
  jmp    L486
  nopl   0x0(%rax)
L981:
  add    $0x1,%rbp
L486:
  cmpb   $0x2a,0x1(%rbp)
  je     L981
  lea    0x1(%rbp),%rax
  mov    %rbp,0x38(%rsp)
  mov    %rax,0x30(%rsp)
L338:
  mov    0x10(%rsp),%r13
  mov    %r13,%rdi
  call   <assert@plt>
  mov    0x30(%rsp),%r15
  mov    %r15,%rdi
  call   <assert@plt>
  mov    0x38(%rsp),%rax
  movzbl 0x1(%rax),%eax
  cmp    $0x2a,%al
  jne    L641
  jmp    L229
  nopl   0x0(%rax)
L946:
  cmp    $0x3f,%al
  je     L341
  cmp    %al,%dl
  jne    L255
L341:
  movzbl 0x1(%r15),%eax
  add    $0x1,%r15
  add    $0x1,%r13
  cmp    $0x2a,%al
  je     L423
L641:
  movzbl 0x0(%r13),%edx
  test   %dl,%dl
  jne    L946
  test   %al,%al
  je     L262
L255:
  addq   $0x1,0x10(%rsp)
  mov    0x10(%rsp),%rax
  cmpb   $0x0,-0x1(%rax)
  jne    L338
  jmp    L978
L1008:
  add    $0x1,%r15
L423:
  cmpb   $0x2a,0x1(%r15)
  je     L1008
  lea    0x1(%r15),%rax
  mov    %r15,0x20(%rsp)
  mov    %rax,0x18(%rsp)
L741:
  mov    %r13,%rdi
  call   <assert@plt>
  mov    0x18(%rsp),%r15
  mov    %r15,%rdi
  call   <assert@plt>
  mov    0x20(%rsp),%rax
  movzbl 0x1(%rax),%eax
  cmp    $0x2a,%al
  je     L349
  mov    %r13,%r14
  jmp    L555
  nopl   0x0(%rax)
L989:
  cmp    %al,%dl
  je     L12
  cmp    $0x3f,%al
  jne    L407
L12:
  movzbl 0x1(%r15),%eax
  add    $0x1,%r15
  add    $0x1,%r14
  cmp    $0x2a,%al
  je     L100
L555:
  movzbl (%r14),%edx
  test   %dl,%dl
  jne    L989
  test   %al,%al
  je     L262
L407:
  add    $0x1,%r13
  cmpb   $0x0,-0x1(%r13)
  jne    L741
  jmp    L255
  nopl   0x0(%rax)
L322:
  add    $0x1,%r15
L100:
  cmpb   $0x2a,0x1(%r15)
  je     L322
  mov    %r13,0x48(%rsp)
  lea    0x1(%r15),%r12
L201:
  mov    %r14,%rdi
  mov    %r12,%rbx
  mov    %r14,%r13
  call   <assert@plt>
  mov    %r12,%rdi
  call   <assert@plt>
  movzbl 0x1(%r15),%eax
  cmp    $0x2a,%al
  jne    L895
  jmp    L760
  nopl   (%rax)
L271:
  cmp    %al,%dl
  je     L633
  cmp    $0x3f,%al
  jne    L513
L633:
  movzbl 0x1(%rbx),%eax
  add    $0x1,%rbx
  add    $0x1,%r13
  cmp    $0x2a,%al
  je     L760
L895:
  movzbl 0x0(%r13),%edx
  test   %dl,%dl
  jne    L271
  test   %al,%al
  je     L262
L513:
  add    $0x1,%r14
  cmpb   $0x0,-0x1(%r14)
  jne    L201
  mov    0x48(%rsp),%r13
  jmp    L407
  xchg   %ax,%ax
L762:
  add    $0x1,%rbx
L760:
  cmpb   $0x2a,0x1(%rbx)
  je     L762
  lea    0x1(%rbx),%rbp
L1019:
  mov    %r13,%rdi
  call   <assert@plt>
  mov    %rbp,%rdi
  call   <assert@plt>
  movzbl 0x1(%rbx),%edx
  mov    %rbp,%rax
  mov    %r13,%rcx
  cmp    $0x2a,%dl
  jne    L277
  jmp    L2
  nop
L175:
  cmp    %sil,%dl
  je     L676
  cmp    $0x3f,%dl
  jne    L288
L676:
  movzbl 0x1(%rax),%edx
  add    $0x1,%rax
  add    $0x1,%rcx
  cmp    $0x2a,%dl
  je     L2
L277:
  movzbl (%rcx),%esi
  test   %sil,%sil
  jne    L175
  test   %dl,%dl
  je     L262
L288:
  add    $0x1,%r13
  cmpb   $0x0,-0x1(%r13)
  jne    L1019
  jmp    L513
  nopl   0x0(%rax,%rax,1)
L649:
  add    $0x1,%rax
L2:
  cmpb   $0x2a,0x1(%rax)
  je     L649
  lea    0x1(%rax),%rdx
L113:
  mov    %rdx,%rsi
  mov    %rcx,%rdi
  mov    %rdx,0x8(%rsp)
  mov    %rcx,(%rsp)
  call   <trio_match_case>
  test   %eax,%eax
  jne    L262
  mov    (%rsp),%rcx
  mov    0x8(%rsp),%rdx
  add    $0x1,%rcx
  cmpb   $0x0,-0x1(%rcx)
  jne    L113
  jmp    L288
L349:
  mov    0x18(%rsp),%r15
  mov    %r13,%r14
  jmp    L100
L229:
  mov    0x30(%rsp),%r15
  mov    0x10(%rsp),%r13
  jmp    L423
L952:
  mov    0x28(%rsp),%rax
  mov    0x68(%rsp),%rbp
  mov    %rax,0x10(%rsp)
  jmp    L486
L462:
  mov    0x80(%rsp),%rax
  mov    %rax,0x50(%rsp)
  mov    0x40(%rsp),%rax
  mov    %rax,0x28(%rsp)
  mov    0x50(%rsp),%rax
  jmp    L509
L56:
  mov    0x90(%rsp),%rax
  mov    %rax,0x60(%rsp)
  mov    0x58(%rsp),%rax
  mov    %rax,0x40(%rsp)
  mov    0x60(%rsp),%rax
  jmp    L823
L993:
  mov    0x98(%rsp),%rax
  mov    %rax,0x70(%rsp)
  mov    0x78(%rsp),%rax
  mov    %rax,0x58(%rsp)
  mov    0x70(%rsp),%rax
  jmp    L516
```

assistant: ```c
__attribute__((visibility("default"))) int trio_match_case(const char *string, const char *pattern) {
  assert(string);
  assert(pattern);
  for (; ('*' != *pattern); ++pattern, ++string) {
    if (((char)0) == *string) {
      return (((char)0) == *pattern);
    }
    if ((*string != *pattern) && ('?' != *pattern)) {
      return (1 == 0);
    }
  }
  while ('*' == pattern[1])
    pattern++;
  do {
    if (trio_match_case(string, &pattern[1])) {
      return (!(1 == 0));
    }
  } while (*string++);
  return (1 == 0);
}
```