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

```asm
<wcsrchr>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  mov    %rax,-0x10(%rbp)
  movq   $0x0,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x1c(%rbp)
  jne    L194
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x8(%rbp)
L194:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jne    L208
  mov    -0x8(%rbp),%rax
  jmp    L88
L208:
  addq   $0x8,-0x18(%rbp)
  mov    -0x10(%rbp),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x1c(%rbp)
  jne    L189
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x8(%rbp)
L189:
  mov    -0x10(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jne    L139
  mov    -0x8(%rbp),%rax
  jmp    L88
L139:
  addq   $0x8,-0x10(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x1c(%rbp)
  jne    L258
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x8(%rbp)
L258:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jne    L105
  mov    -0x8(%rbp),%rax
  jmp    L88
L105:
  addq   $0x8,-0x18(%rbp)
  mov    -0x10(%rbp),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x1c(%rbp)
  jne    L228
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x8(%rbp)
L228:
  mov    -0x10(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jne    L104
  mov    -0x8(%rbp),%rax
  jmp    L88
L104:
  addq   $0x8,-0x10(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x1c(%rbp)
  jne    L173
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x8(%rbp)
L173:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jne    L255
  mov    -0x8(%rbp),%rax
  jmp    L88
L255:
  addq   $0x8,-0x18(%rbp)
  mov    -0x10(%rbp),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x1c(%rbp)
  jne    L240
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x8(%rbp)
L240:
  mov    -0x10(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jne    L68
  mov    -0x8(%rbp),%rax
  jmp    L88
L68:
  addq   $0x8,-0x10(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x1c(%rbp)
  jne    L220
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x8(%rbp)
L220:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jne    L10
  mov    -0x8(%rbp),%rax
  jmp    L88
L10:
  addq   $0x8,-0x18(%rbp)
  mov    -0x10(%rbp),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x1c(%rbp)
  jne    L183
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x8(%rbp)
L183:
  mov    -0x10(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jne    L151
  mov    -0x8(%rbp),%rax
  jmp    L88
L151:
  addq   $0x8,-0x10(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x1c(%rbp)
  jne    L200
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x8(%rbp)
L200:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jne    L208
  mov    -0x8(%rbp),%rax
L88:
  pop    %rbp
  ret
```

assistant: ```c
wchar_t *wcsrchr(const wchar_t *wcs, const wchar_t wc) {
  const wchar_t *wcs2 = wcs + 1;
  const wchar_t *retval = NULL;
  if (*wcs == wc)
    retval = wcs;
  if (*wcs == L'\0')
    return (wchar_t *)retval;
  do {
    wcs += 2;
    if (*wcs2 == wc)
      retval = wcs2;
    if (*wcs2 == L'\0')
      return (wchar_t *)retval;
    wcs2 += 2;
    if (*wcs == wc)
      retval = wcs;
    if (*wcs == L'\0')
      return (wchar_t *)retval;
    wcs += 2;
    if (*wcs2 == wc)
      retval = wcs2;
    if (*wcs2 == L'\0')
      return (wchar_t *)retval;
    wcs2 += 2;
    if (*wcs == wc)
      retval = wcs;
    if (*wcs == L'\0')
      return (wchar_t *)retval;
    wcs += 2;
    if (*wcs2 == wc)
      retval = wcs2;
    if (*wcs2 == L'\0')
      return (wchar_t *)retval;
    wcs2 += 2;
    if (*wcs == wc)
      retval = wcs;
    if (*wcs == L'\0')
      return (wchar_t *)retval;
    wcs += 2;
    if (*wcs2 == wc)
      retval = wcs2;
    if (*wcs2 == L'\0')
      return (wchar_t *)retval;
    wcs2 += 2;
    if (*wcs == wc)
      retval = wcs;
  } while (*wcs != L'\0');
  return (wchar_t *)retval;
}
```