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

```asm
<json_field>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %rdi,%rbx
  mov    %rsi,0x18(%rsp)
  mov    %edx,0x14(%rsp)
  mov    %rcx,0x8(%rsp)
  mov    %rsi,%rdi
  call   <strlen@plt>
  test   %rbx,%rbx
  je     L118
  mov    %rax,%r13
  mov    %rbx,%rdi
  call   <strlen@plt>
  cmp    %r13,%rax
  jbe    L118
  mov    $0x0,%eax
  lea    (%rbx,%r13,1),%rbp
  cmpb   $0x0,(%rbx,%r13,1)
  jne    L64
L258:
  mov    0x8(%rsp),%rax
  movq   $0x0,(%rax)
  jmp    L127
L118:
  mov    0x8(%rsp),%rax
  movq   $0x0,(%rax)
L127:
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L106:
  cmpb   $0x1,0x1(%rbx,%rax,1)
  sbb    $0xffffffffffffffff,%rax
L234:
  add    $0x1,%rax
  cmpb   $0x0,0x0(%rbp,%rax,1)
  je     L258
L64:
  movzbl (%rbx,%rax,1),%edx
  cmp    $0x5c,%dl
  je     L106
  cmp    $0x22,%dl
  jne    L234
  lea    0x1(%rax),%r12
  lea    (%rbx,%r12,1),%rdi
  cmpb   $0x3a,(%rdi)
  je     L234
  lea    (%r12,%r13,1),%r15
  lea    (%rbx,%r15,1),%r14
  mov    %r12,%rax
  cmpb   $0x22,(%r14)
  jne    L234
  movb   $0x0,(%r14)
  mov    0x18(%rsp),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L23
  movb   $0x22,(%r14)
  mov    %r12,%rax
  jmp    L234
L23:
  movb   $0x22,(%r14)
  cmpb   $0x3a,0x1(%rbx,%r15,1)
  je     L8
  mov    %r12,%rax
  jmp    L234
L161:
  lea    0x2(%rbx,%r15,1),%rbp
  cmpb   $0x2d,0x0(%rbp)
  sete   %dl
  sete   %bl
  movzbl %bl,%ebx
  movzbl 0x0(%rbp,%rbx,1),%eax
  sub    $0x30,%eax
  cmp    $0x9,%al
  ja     L214
L126:
  add    $0x1,%rbx
  movzbl 0x2(%r14,%rbx,1),%eax
  sub    $0x30,%eax
  cmp    $0x9,%al
  jbe    L126
L214:
  test   %rbx,%rbx
  je     L215
  cmp    $0x1,%rbx
  jne    L6
  test   %dl,%dl
  jne    L215
L6:
  lea    0x1(%rbx),%edi
  call   <malloc@plt>
  mov    %rax,%rdi
  mov    0x8(%rsp),%r15
  mov    %rax,(%r15)
  mov    %rbx,%rdx
  mov    %rbp,%rsi
  call   <strncpy@plt>
  mov    (%r15),%rax
  movb   $0x0,(%rax,%rbx,1)
  jmp    L127
L215:
  mov    0x8(%rsp),%rax
  movq   $0x0,(%rax)
  jmp    L127
L199:
  cmpb   $0x22,0x2(%rbx,%r15,1)
  jne    L237
  add    $0x3,%r15
  lea    (%rbx,%r15,1),%r12
  movzbl (%r12),%eax
  mov    $0x0,%ebp
  cmp    $0x22,%al
  je     L37
L7:
  cmp    $0x5c,%al
  sete   %al
  movzbl %al,%eax
  lea    0x1(%rbp,%rax,1),%rbp
  lea    (%rbx,%rbp,1),%rax
  movzbl (%rax,%r15,1),%eax
  cmp    $0x22,%al
  jne    L7
L37:
  lea    0x1(%rbp),%edi
  call   <malloc@plt>
  mov    %rax,%rdi
  mov    0x8(%rsp),%rbx
  mov    %rax,(%rbx)
  mov    %rbp,%rdx
  mov    %r12,%rsi
  call   <strncpy@plt>
  mov    (%rbx),%rax
  movb   $0x0,(%rax,%rbp,1)
  jmp    L127
L237:
  mov    0x8(%rsp),%rax
  movq   $0x0,(%rax)
  jmp    L127
L34:
  add    $0x1,%rax
L293:
  add    $0x1,%rbp
  test   %rax,%rax
  je     L12
L166:
  movzbl 0x2(%r14,%rbp,1),%edx
  cmp    $0x7b,%dl
  je     L34
  cmp    $0x7d,%dl
  sete   %dl
  movzbl %dl,%edx
  sub    %rdx,%rax
  jmp    L293
L12:
  test   %rbp,%rbp
  jne    L207
  mov    0x8(%rsp),%rax
  movq   $0x0,(%rax)
  jmp    L127
L207:
  lea    0x1(%rbp),%edi
  call   <malloc@plt>
  mov    %rax,%rdi
  mov    0x8(%rsp),%r14
  mov    %rax,(%r14)
  lea    (%rbx,%r15,1),%rsi
  mov    %rbp,%rdx
  call   <strncpy@plt>
  mov    (%r14),%rax
  movb   $0x0,(%rax,%rbp,1)
  jmp    L127
L8:
  cmpb   $0x0,0x14(%rsp)
  je     L161
  cmpb   $0x1,0x14(%rsp)
  je     L199
  cmpb   $0x2,0x14(%rsp)
  jne    L127
  mov    $0x0,%eax
  mov    $0x0,%ebp
  add    $0x2,%r15
  jmp    L166
```

assistant: ```c
void json_field(char *full_message, const char *field, char type, char **value) {
  size_t i = 0, j = 0, nest_lv = 0, len = strlen(field);
  if (full_message == NULL || strlen(full_message) <= len) {
    *value = NULL;
    return;
  }
  for (i = 0; full_message[len + i] != '\0'; i++)
    if (full_message[i] == '\\' && full_message[i + 1] != '\0')
      i++;
    else if (full_message[i] == '"' && full_message[i + 1] != ':') {
      i++;
      if (full_message[len + i] == '"') {
        full_message[len + i] = '\0';
        if (strcmp(&full_message[i], field) != 0)
          full_message[len + i] = '"';
        else {
          full_message[len + i] = '"';
          if (full_message[len + i + 1] == ':')
            break;
        }
      }
    }
  if (full_message[len + i] == '\0')
    *value = NULL;
  else if (type == 0) {
    j = 0;
    if (full_message[len + i + 2] == '-')
      j++;
    while (1)
      if ((full_message[len + i + 2 + j] >= '0') && (full_message[len + i + 2 + j] <= '9'))
        j++;
      else
        break;
    if (j == 0 || (full_message[len + i + 2] == '-' && j == 1)) {
      *value = NULL;
      return;
    }
    *value = (char *)malloc(sizeof(char) * (j + 1));
    strncpy(*value, &full_message[len + i + 2], j);
    (*value)[j] = '\0';
  } else if (type == 1) {
    if (full_message[len + i + 2] != '"') {
      *value = NULL;
      return;
    }
    for (j = 0; full_message[len + i + j + 3] != '"'; j++)
      if (full_message[len + i + j + 3] == '\\')
        j++;
    *value = (char *)malloc(sizeof(char) * (j + 1));
    strncpy(*value, &full_message[len + i + 3], j);
    (*value)[j] = '\0';
  } else if (type == 2) {
    do {
      if (full_message[len + i + 2 + j] == '{')
        nest_lv++;
      else if (full_message[len + i + 2 + j] == '}')
        nest_lv--;
      j++;
    } while (nest_lv > 0);
    if (j == 0)
      *value = NULL;
    else {
      *value = malloc(sizeof(char) * (j + 1));
      strncpy(*value, &full_message[len + i + 2], j);
      (*value)[j] = '\0';
    }
  }
  return;
}
```