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

```asm
<json_field>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %edx,%eax
  mov    %rcx,-0x40(%rbp)
  mov    %al,-0x34(%rbp)
  movq   $0x0,-0x20(%rbp)
  movq   $0x0,-0x18(%rbp)
  movq   $0x0,-0x10(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x28(%rbp)
  je     L136
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  cmp    %rax,-0x8(%rbp)
  jb     L158
L136:
  mov    -0x40(%rbp),%rax
  movq   $0x0,(%rax)
  jmp    L138
L158:
  movq   $0x0,-0x20(%rbp)
  jmp    L24
L116:
  mov    -0x28(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L293
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L293
  addq   $0x1,-0x20(%rbp)
  jmp    L31
L293:
  mov    -0x28(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x22,%al
  jne    L31
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x3a,%al
  je     L31
  addq   $0x1,-0x20(%rbp)
  mov    -0x8(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x22,%al
  jne    L31
  mov    -0x8(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  mov    -0x28(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  mov    -0x30(%rbp),%rax
  mov    %rax,%rsi
  mov    %rdx,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L26
  mov    -0x8(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movb   $0x22,(%rax)
  jmp    L31
L26:
  mov    -0x8(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movb   $0x22,(%rax)
  mov    -0x8(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  lea    0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x3a,%al
  je     L88
L31:
  addq   $0x1,-0x20(%rbp)
L24:
  mov    -0x8(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L116
  jmp    L2
L88:
  nop
L2:
  mov    -0x8(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L41
  mov    -0x40(%rbp),%rax
  movq   $0x0,(%rax)
  jmp    L279
L41:
  cmpb   $0x0,-0x34(%rbp)
  jne    L170
  movq   $0x0,-0x18(%rbp)
  mov    -0x8(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  lea    0x2(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2d,%al
  jne    L7
  addq   $0x1,-0x18(%rbp)
L7:
  mov    -0x8(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  lea    0x2(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jle    L405
  mov    -0x8(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  lea    0x2(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x39,%al
  jg     L405
  addq   $0x1,-0x18(%rbp)
  jmp    L7
L405:
  cmpq   $0x0,-0x18(%rbp)
  je     L343
  mov    -0x8(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  lea    0x2(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2d,%al
  jne    L150
  cmpq   $0x1,-0x18(%rbp)
  jne    L150
L343:
  mov    -0x40(%rbp),%rax
  movq   $0x0,(%rax)
  jmp    L138
L150:
  mov    -0x18(%rbp),%rax
  add    $0x1,%eax
  mov    %eax,%edi
  call   <malloc@plt>
  mov    -0x40(%rbp),%rdx
  mov    %rax,(%rdx)
  mov    -0x8(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  lea    0x2(%rax),%rdx
  mov    -0x28(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x40(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x18(%rbp),%rdx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  mov    -0x40(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  jmp    L279
L170:
  cmpb   $0x1,-0x34(%rbp)
  jne    L292
  mov    -0x8(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  lea    0x2(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x22,%al
  je     L372
  mov    -0x40(%rbp),%rax
  movq   $0x0,(%rax)
  jmp    L138
L372:
  movq   $0x0,-0x18(%rbp)
  jmp    L19
L20:
  mov    -0x8(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  lea    0x3(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L206
  addq   $0x1,-0x18(%rbp)
L206:
  addq   $0x1,-0x18(%rbp)
L19:
  mov    -0x8(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  lea    0x3(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x22,%al
  jne    L20
  mov    -0x18(%rbp),%rax
  add    $0x1,%eax
  mov    %eax,%edi
  call   <malloc@plt>
  mov    -0x40(%rbp),%rdx
  mov    %rax,(%rdx)
  mov    -0x8(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  lea    0x3(%rax),%rdx
  mov    -0x28(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x40(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x18(%rbp),%rdx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  mov    -0x40(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  jmp    L279
L292:
  cmpb   $0x2,-0x34(%rbp)
  jne    L279
L141:
  mov    -0x8(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  lea    0x2(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x7b,%al
  jne    L406
  addq   $0x1,-0x10(%rbp)
  jmp    L109
L406:
  mov    -0x8(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  lea    0x2(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x7d,%al
  jne    L109
  subq   $0x1,-0x10(%rbp)
L109:
  addq   $0x1,-0x18(%rbp)
  cmpq   $0x0,-0x10(%rbp)
  jne    L141
  cmpq   $0x0,-0x18(%rbp)
  jne    L364
  mov    -0x40(%rbp),%rax
  movq   $0x0,(%rax)
  jmp    L279
L364:
  mov    -0x18(%rbp),%rax
  add    $0x1,%eax
  mov    %eax,%edi
  call   <malloc@plt>
  mov    -0x40(%rbp),%rdx
  mov    %rax,(%rdx)
  mov    -0x8(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  lea    0x2(%rax),%rdx
  mov    -0x28(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x40(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x18(%rbp),%rdx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  mov    -0x40(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
L279:
  nop
L138:
  leave
  ret
```

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;
}
```