user: 请从给定的汇编指令推导出C源代码：

```asm
<js0n>:
  endbr64
  mov    %rdi,%r11
  mov    %rdx,%rdi
  mov    %esi,%esi
  lea    (%r11,%rsi,1),%r8
  mov    %ecx,%ecx
  lea    (%rdx,%rcx,2),%r9
  cmp    %r9,%rdx
  jae    L97
  cmp    %r8,%r11
  jae    L97
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  lea    -0x1(%r11),%rsi
  mov    %r11,%rax
  lea    D50(%rip),%rcx
  mov    $0x0,%ebp
  mov    $0x0,%r10d
  mov    $0x0,%ebx
  mov    %rcx,%r12
  lea    D124(%rip),%r13
  jmp    L37
L222:
  cmp    %r9,%rdi
  jae    L17
  movw   $0x0,(%rdi)
  jmp    L17
  endbr64
  mov    $0x1,%r10d
L17:
  mov    %r10d,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  endbr64
  cmp    $0x1,%r10d
  je     L47
L76:
  add    $0x1,%r10d
L262:
  endbr64
  add    $0x1,%rax
  add    $0x1,%rsi
  cmp    %rax,%r8
  jbe    L222
  cmp    %r9,%rdi
  jae    L222
L37:
  movzbl (%rax),%edx
  mov    (%rcx,%rdx,8),%rdx
L175:
  jmp    *%rdx
L47:
  mov    %rax,%rdx
  sub    %r11,%rdx
  mov    %edx,%ebx
  mov    %dx,(%rdi)
  lea    0x2(%rdi),%rdi
  jmp    L76
  endbr64
  sub    $0x1,%r10d
  cmp    $0x1,%r10d
  jne    L262
  mov    %rdi,%rdx
  add    $0x2,%rdi
  movzwl %bx,%ebx
  add    %r11,%rbx
  mov    %rax,%r14
  sub    %rbx,%r14
  lea    0x1(%r14),%ebx
  mov    %bx,(%rdx)
  jmp    L262
  endbr64
  lea    D124(%rip),%rcx
  cmp    $0x1,%r10d
  jne    L262
  mov    %rdi,%rcx
  add    $0x2,%rdi
  lea    0x1(%rax),%rdx
  sub    %r11,%rdx
  mov    %edx,%ebx
  mov    %dx,(%rcx)
  lea    D124(%rip),%rcx
  jmp    L262
  endbr64
  lea    D50(%rip),%rcx
  cmp    $0x1,%r10d
  jne    L262
  mov    %rdi,%rdx
  add    $0x2,%rdi
  movzwl %bx,%ebx
  add    %r11,%rbx
  mov    %rsi,%rcx
  sub    %rbx,%rcx
  lea    0x1(%rcx),%ebx
  mov    %bx,(%rdx)
  lea    D50(%rip),%rcx
  jmp    L262
  endbr64
  lea    D99(%rip),%rcx
  jmp    L262
  endbr64
  lea    D124(%rip),%rcx
  jmp    L262
  endbr64
  lea    D14(%rip),%rcx
  cmp    $0x1,%r10d
  jne    L262
  mov    %rdi,%rcx
  add    $0x2,%rdi
  mov    %rax,%rdx
  sub    %r11,%rdx
  mov    %edx,%ebx
  mov    %dx,(%rcx)
  lea    D14(%rip),%rcx
  jmp    L262
  endbr64
  cmp    $0x1,%r10d
  je     L27
L29:
  movzbl (%rax),%edx
  mov    (%r12,%rdx,8),%rdx
  mov    %r12,%rcx
  jmp    L175
L27:
  movzwl %bx,%ebx
  add    %r11,%rbx
  mov    %rsi,%rdx
  sub    %rbx,%rdx
  lea    0x1(%rdx),%ebx
  mov    %bx,(%rdi)
  lea    0x2(%rdi),%rdi
  jmp    L29
  endbr64
  lea    D84(%rip),%rcx
  mov    $0x1,%ebp
  jmp    L262
  endbr64
  lea    D84(%rip),%rcx
  mov    $0x2,%ebp
  jmp    L262
  endbr64
  lea    D84(%rip),%rcx
  mov    $0x3,%ebp
  jmp    L262
  endbr64
  sub    $0x1,%ebp
  cmove  %r13,%rcx
  jmp    L262
L97:
  mov    $0x0,%r10d
  cmp    %r9,%rdi
  jae    L168
  movw   $0x0,(%rdi)
L168:
  mov    %r10d,%eax
  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;
}
```