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

```asm
<js0n>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x38(%rbp)
  mov    %esi,-0x3c(%rbp)
  mov    %rdx,-0x48(%rbp)
  mov    %ecx,-0x40(%rbp)
  movw   $0x0,-0x2a(%rbp)
  movl   $0x0,-0x28(%rbp)
  movl   $0x0,-0x24(%rbp)
  lea    D33(%rip),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x3c(%rbp),%edx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x40(%rbp),%eax
  lea    (%rax,%rax,1),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x8(%rbp)
  jmp    L224
L98:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  jmp    L145
L10:
  nop
  jmp    L133
L178:
  nop
L133:
  endbr64
  addq   $0x1,-0x20(%rbp)
  jmp    L224
L145:
  jmp    *%rax
L224:
  mov    -0x20(%rbp),%rax
  cmp    -0x10(%rbp),%rax
  jae    L22
  mov    -0x48(%rbp),%rax
  cmp    -0x8(%rbp),%rax
  jb     L98
L22:
  mov    -0x48(%rbp),%rax
  cmp    -0x8(%rbp),%rax
  jae    L228
  mov    -0x48(%rbp),%rax
  movw   $0x0,(%rax)
L228:
  mov    -0x28(%rbp),%eax
  jmp    L258
  endbr64
  mov    $0x1,%eax
  jmp    L258
  endbr64
  cmpl   $0x1,-0x28(%rbp)
  jne    L234
  mov    -0x20(%rbp),%rax
  sub    -0x38(%rbp),%rax
  mov    %rax,%rcx
  mov    -0x48(%rbp),%rax
  lea    0x2(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  mov    %ecx,%edx
  mov    %dx,(%rax)
  movzwl (%rax),%eax
  mov    %ax,-0x2a(%rbp)
L234:
  addl   $0x1,-0x28(%rbp)
  jmp    L133
  endbr64
  subl   $0x1,-0x28(%rbp)
  cmpl   $0x1,-0x28(%rbp)
  jne    L10
  movzwl -0x2a(%rbp),%edx
  mov    -0x38(%rbp),%rax
  add    %rax,%rdx
  mov    -0x20(%rbp),%rax
  sub    %rdx,%rax
  mov    %eax,%ecx
  mov    -0x48(%rbp),%rax
  lea    0x2(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  lea    0x1(%rcx),%edx
  mov    %dx,(%rax)
  movzwl (%rax),%eax
  mov    %ax,-0x2a(%rbp)
  jmp    L10
  endbr64
  cmpl   $0x1,-0x28(%rbp)
  jne    L192
  mov    -0x20(%rbp),%rax
  add    $0x1,%rax
  sub    -0x38(%rbp),%rax
  mov    %rax,%rcx
  mov    -0x48(%rbp),%rax
  lea    0x2(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  mov    %ecx,%edx
  mov    %dx,(%rax)
  movzwl (%rax),%eax
  mov    %ax,-0x2a(%rbp)
L192:
  lea    D81(%rip),%rax
  mov    %rax,-0x18(%rbp)
  jmp    L133
  endbr64
  cmpl   $0x1,-0x28(%rbp)
  jne    L186
  mov    -0x20(%rbp),%rax
  sub    $0x1,%rax
  movzwl -0x2a(%rbp),%ecx
  mov    -0x38(%rbp),%rdx
  add    %rcx,%rdx
  sub    %rdx,%rax
  mov    %eax,%ecx
  mov    -0x48(%rbp),%rax
  lea    0x2(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  lea    0x1(%rcx),%edx
  mov    %dx,(%rax)
  movzwl (%rax),%eax
  mov    %ax,-0x2a(%rbp)
L186:
  lea    D33(%rip),%rax
  mov    %rax,-0x18(%rbp)
  jmp    L133
  endbr64
  lea    D7(%rip),%rax
  mov    %rax,-0x18(%rbp)
  jmp    L133
  endbr64
  lea    D81(%rip),%rax
  mov    %rax,-0x18(%rbp)
  jmp    L133
  endbr64
  cmpl   $0x1,-0x28(%rbp)
  jne    L188
  mov    -0x20(%rbp),%rax
  sub    -0x38(%rbp),%rax
  mov    %rax,%rcx
  mov    -0x48(%rbp),%rax
  lea    0x2(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  mov    %ecx,%edx
  mov    %dx,(%rax)
  movzwl (%rax),%eax
  mov    %ax,-0x2a(%rbp)
L188:
  lea    D109(%rip),%rax
  mov    %rax,-0x18(%rbp)
  jmp    L133
  endbr64
  cmpl   $0x1,-0x28(%rbp)
  jne    L127
  mov    -0x20(%rbp),%rax
  sub    $0x1,%rax
  movzwl -0x2a(%rbp),%ecx
  mov    -0x38(%rbp),%rdx
  add    %rcx,%rdx
  sub    %rdx,%rax
  mov    %eax,%ecx
  mov    -0x48(%rbp),%rax
  lea    0x2(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  lea    0x1(%rcx),%edx
  mov    %dx,(%rax)
  movzwl (%rax),%eax
  mov    %ax,-0x2a(%rbp)
L127:
  lea    D33(%rip),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  jmp    L145
  endbr64
  lea    D51(%rip),%rax
  mov    %rax,-0x18(%rbp)
  movl   $0x1,-0x24(%rbp)
  jmp    L133
  endbr64
  lea    D51(%rip),%rax
  mov    %rax,-0x18(%rbp)
  movl   $0x2,-0x24(%rbp)
  jmp    L133
  endbr64
  lea    D51(%rip),%rax
  mov    %rax,-0x18(%rbp)
  movl   $0x3,-0x24(%rbp)
  jmp    L133
  endbr64
  subl   $0x1,-0x24(%rbp)
  cmpl   $0x0,-0x24(%rbp)
  jne    L178
  lea    D81(%rip),%rax
  mov    %rax,-0x18(%rbp)
  jmp    L178
L258:
  pop    %rbp
  ret
```

assistant: ```c
int js0n(const unsigned char *js, unsigned int len, unsigned short *out, unsigned int olen) {
  unsigned short prev = 0, *oend;
  const unsigned char *cur, *end;
  int depth = 0;
  int utf8_remain = 0;
  static void *gostruct[] = {[0 ... 255] = &&l_bad, ['\t'] = &&l_loop, [' '] = &&l_loop, ['\r'] = &&l_loop, ['\n'] = &&l_loop, ['"'] = &&l_qup, [':'] = &&l_loop, [','] = &&l_loop, ['['] = &&l_up, [']'] = &&l_down, ['{'] = &&l_up, ['}'] = &&l_down, ['-'] = &&l_bare, [48 ... 57] = &&l_bare, ['t'] = &&l_bare, ['f'] = &&l_bare, ['n'] = &&l_bare};
  static void *gobare[] = {[0 ... 31] = &&l_bad, [32 ... 126] = &&l_loop, ['\t'] = &&l_unbare, [' '] = &&l_unbare, ['\r'] = &&l_unbare, ['\n'] = &&l_unbare, [','] = &&l_unbare, [']'] = &&l_unbare, ['}'] = &&l_unbare, [127 ... 255] = &&l_bad};
  static void *gostring[] = {[0 ... 31] = &&l_bad, [127] = &&l_bad, [32 ... 126] = &&l_loop, ['\\'] = &&l_esc, ['"'] = &&l_qdown, [128 ... 191] = &&l_bad, [192 ... 223] = &&l_utf8_2, [224 ... 239] = &&l_utf8_3, [240 ... 247] = &&l_utf8_4, [248 ... 255] = &&l_bad};
  static void *goutf8_continue[] = {[0 ... 127] = &&l_bad, [128 ... 191] = &&l_utf_continue, [192 ... 255] = &&l_bad};
  static void *goesc[] = {[0 ... 255] = &&l_bad, ['"'] = &&l_unesc, ['\\'] = &&l_unesc, ['/'] = &&l_unesc, ['b'] = &&l_unesc, ['f'] = &&l_unesc, ['n'] = &&l_unesc, ['r'] = &&l_unesc, ['t'] = &&l_unesc, ['u'] = &&l_unesc};
  void **go = gostruct;
  for (cur = js, end = js + len, oend = out + olen; cur < end && out < oend; cur++) {
    goto *go[*cur];
  l_loop:;
  }
  if (out < oend)
    *out = 0;
  return depth;
l_bad:
  return 1;
l_up:
  if (depth == 1)
    prev = *out++ = ((cur + 0) - js);
  ++depth;
  goto l_loop;
l_down:
  --depth;
  if (depth == 1)
    prev = *out++ = ((cur + 0) - (js + prev) + 1);
  goto l_loop;
l_qup:
  if (depth == 1)
    prev = *out++ = ((cur + 1) - js);
  go = gostring;
  goto l_loop;
l_qdown:
  if (depth == 1)
    prev = *out++ = ((cur + -1) - (js + prev) + 1);
  go = gostruct;
  goto l_loop;
l_esc:
  go = goesc;
  goto l_loop;
l_unesc:
  go = gostring;
  goto l_loop;
l_bare:
  if (depth == 1)
    prev = *out++ = ((cur + 0) - js);
  go = gobare;
  goto l_loop;
l_unbare:
  if (depth == 1)
    prev = *out++ = ((cur + -1) - (js + prev) + 1);
  go = gostruct;
  goto *go[*cur];
l_utf8_2:
  go = goutf8_continue;
  utf8_remain = 1;
  goto l_loop;
l_utf8_3:
  go = goutf8_continue;
  utf8_remain = 2;
  goto l_loop;
l_utf8_4:
  go = goutf8_continue;
  utf8_remain = 3;
  goto l_loop;
l_utf_continue:
  if (!--utf8_remain)
    go = gostring;
  goto l_loop;
}
```