user: 这段汇编代码用C语言表示是什么样的：

```asm
<parse_sfo_content>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x88,%rsp
  mov    %rdi,-0x68(%rbp)
  mov    %esi,-0x6c(%rbp)
  mov    %rdx,-0x78(%rbp)
  mov    %rcx,-0x80(%rbp)
  mov    %r8,-0x88(%rbp)
  mov    %r9,-0x90(%rbp)
  mov    -0x68(%rbp),%rax
  mov    %rax,%rdi
  call   <get32le@plt>
  cmp    $0x46535000,%eax
  je     L204
  lea    D20(%rip),%rax
  mov    %rax,%rdi
  call   <sys_error@plt>
L204:
  mov    -0x68(%rbp),%rax
  add    $0x20,%rax
  mov    %rax,%rdi
  call   <get32le@plt>
  mov    %eax,-0x3c(%rbp)
  mov    -0x68(%rbp),%rax
  add    $0x30,%rax
  mov    %rax,%rdi
  call   <get32le@plt>
  mov    %eax,-0x38(%rbp)
  mov    -0x68(%rbp),%rax
  add    $0x40,%rax
  mov    %rax,%rdi
  call   <get32le@plt>
  mov    %eax,-0x34(%rbp)
  movl   $0xffffffff,-0x54(%rbp)
  movl   $0xffffffff,-0x50(%rbp)
  movl   $0xffffffff,-0x4c(%rbp)
  movl   $0xffffffff,-0x48(%rbp)
  movl   $0xffffffff,-0x44(%rbp)
  movl   $0x0,-0x40(%rbp)
  jmp    L229
L156:
  mov    -0x40(%rbp),%eax
  shl    $0x4,%eax
  add    $0x15,%eax
  cmp    %eax,-0x6c(%rbp)
  jg     L430
  lea    D12(%rip),%rax
  mov    %rax,%rdi
  call   <sys_error@plt>
L430:
  mov    -0x3c(%rbp),%eax
  movslq %eax,%rbx
  mov    -0x40(%rbp),%eax
  shl    $0x4,%eax
  cltq
  add    $0x14,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdi
  call   <get16le@plt>
  cltq
  lea    (%rbx,%rax,1),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  lea    D35(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L321
  cmpl   $0x0,-0x54(%rbp)
  jns    L111
  mov    -0x40(%rbp),%eax
  mov    %eax,-0x54(%rbp)
  jmp    L111
L321:
  mov    -0x18(%rbp),%rax
  lea    D39(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L277
  mov    -0x40(%rbp),%eax
  mov    %eax,-0x54(%rbp)
  jmp    L111
L277:
  mov    -0x18(%rbp),%rax
  lea    D22(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L199
  mov    -0x40(%rbp),%eax
  mov    %eax,-0x50(%rbp)
  jmp    L111
L199:
  mov    -0x18(%rbp),%rax
  lea    D75(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L0
  mov    -0x40(%rbp),%eax
  mov    %eax,-0x4c(%rbp)
  jmp    L111
L0:
  mov    -0x18(%rbp),%rax
  lea    D47(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L139
  mov    -0x40(%rbp),%eax
  mov    %eax,-0x48(%rbp)
  jmp    L111
L139:
  mov    -0x18(%rbp),%rax
  lea    D54(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L111
  mov    -0x40(%rbp),%eax
  mov    %eax,-0x44(%rbp)
L111:
  addl   $0x1,-0x40(%rbp)
L229:
  mov    -0x40(%rbp),%eax
  cmp    -0x34(%rbp),%eax
  jl     L156
  cmpl   $0x0,-0x54(%rbp)
  jns    L254
  lea    D58(%rip),%rax
  mov    %rax,%rdi
  call   <sys_error@plt>
L254:
  mov    -0x38(%rbp),%eax
  movslq %eax,%rbx
  mov    -0x54(%rbp),%eax
  shl    $0x4,%eax
  cltq
  add    $0x20,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdi
  call   <get32le@plt>
  cltq
  lea    (%rbx,%rax,1),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x30(%rbp)
  movq   $0xff,-0x20(%rbp)
  movq   $0x0,-0x28(%rbp)
  jmp    L78
L37:
  mov    -0x30(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x1f,%al
  jle    L225
  mov    -0x30(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x7f,%al
  je     L225
  mov    -0x30(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%esi
  lea    D88(%rip),%rax
  mov    %rax,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  jne    L225
  mov    -0x30(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x3a,%al
  jne    L329
  mov    -0x80(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x80(%rbp)
  movb   $0x20,(%rax)
  mov    -0x80(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x80(%rbp)
  movb   $0x2d,(%rax)
  subq   $0x1,-0x20(%rbp)
  jmp    L312
L329:
  mov    -0x80(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x80(%rbp)
  mov    -0x30(%rbp),%rdx
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
  jmp    L312
L225:
  mov    -0x30(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0xa,%al
  jne    L312
  mov    -0x80(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x80(%rbp)
  movb   $0x20,(%rax)
L312:
  addq   $0x1,-0x28(%rbp)
  addq   $0x1,-0x30(%rbp)
L78:
  mov    -0x28(%rbp),%rax
  cmp    -0x20(%rbp),%rax
  jae    L396
  mov    -0x30(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L37
L396:
  mov    -0x80(%rbp),%rax
  movb   $0x0,(%rax)
  cmpl   $0x0,-0x50(%rbp)
  js     L150
  cmpq   $0x0,-0x88(%rbp)
  je     L150
  mov    -0x38(%rbp),%eax
  movslq %eax,%rbx
  mov    -0x50(%rbp),%eax
  shl    $0x4,%eax
  cltq
  add    $0x20,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdi
  call   <get32le@plt>
  cltq
  lea    (%rbx,%rax,1),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x30(%rbp)
  jmp    L262
L240:
  mov    -0x30(%rbp),%rdx
  lea    0x1(%rdx),%rax
  mov    %rax,-0x30(%rbp)
  mov    -0x88(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    %rcx,-0x88(%rbp)
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
L262:
  mov    -0x30(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L240
  mov    -0x88(%rbp),%rax
  movb   $0x0,(%rax)
L150:
  cmpl   $0x0,-0x4c(%rbp)
  js     L49
  mov    -0x38(%rbp),%eax
  movslq %eax,%rbx
  mov    -0x4c(%rbp),%eax
  shl    $0x4,%eax
  cltq
  add    $0x20,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdi
  call   <get32le@plt>
  cltq
  lea    (%rbx,%rax,1),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x30(%rbp)
  jmp    L234
L171:
  mov    -0x30(%rbp),%rdx
  lea    0x1(%rdx),%rax
  mov    %rax,-0x30(%rbp)
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    %rcx,-0x78(%rbp)
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
L234:
  mov    -0x30(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L171
L49:
  mov    -0x78(%rbp),%rax
  movb   $0x0,(%rax)
  cmpl   $0x0,-0x48(%rbp)
  js     L377
  cmpq   $0x0,-0x90(%rbp)
  je     L377
  mov    -0x38(%rbp),%eax
  movslq %eax,%rbx
  mov    -0x48(%rbp),%eax
  shl    $0x4,%eax
  cltq
  add    $0x20,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdi
  call   <get32le@plt>
  cltq
  lea    (%rbx,%rax,1),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x30(%rbp)
  mov    -0x30(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x30,%al
  jne    L331
  addq   $0x1,-0x30(%rbp)
  jmp    L331
L320:
  mov    -0x30(%rbp),%rdx
  lea    0x1(%rdx),%rax
  mov    %rax,-0x30(%rbp)
  mov    -0x90(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    %rcx,-0x90(%rbp)
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
L331:
  mov    -0x30(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L320
  mov    -0x90(%rbp),%rax
  sub    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x30,%al
  jne    L153
  mov    -0x90(%rbp),%rax
  sub    $0x1,%rax
  movb   $0x0,(%rax)
  jmp    L377
L153:
  mov    -0x90(%rbp),%rax
  movb   $0x0,(%rax)
L377:
  cmpl   $0x0,-0x44(%rbp)
  js     L384
  cmpq   $0x0,0x10(%rbp)
  je     L384
  mov    -0x38(%rbp),%eax
  movslq %eax,%rbx
  mov    -0x44(%rbp),%eax
  shl    $0x4,%eax
  cltq
  add    $0x20,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdi
  call   <get32le@plt>
  cltq
  lea    (%rbx,%rax,1),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x30(%rbp)
  mov    -0x30(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x30,%al
  jne    L47
  addq   $0x1,-0x30(%rbp)
  jmp    L47
L457:
  mov    -0x30(%rbp),%rdx
  lea    0x1(%rdx),%rax
  mov    %rax,-0x30(%rbp)
  mov    0x10(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    %rcx,0x10(%rbp)
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
L47:
  mov    -0x30(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L457
  mov    0x10(%rbp),%rax
  movb   $0x0,(%rax)
L384:
  nop
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_tag: D20
datatype: string
name: unpack_data
arguments: data_tag: D12
datatype: string
name: unpack_data
arguments: data_tag: D35
datatype: string
name: unpack_data
arguments: data_tag: D39
datatype: string
name: unpack_data
arguments: data_tag: D22
datatype: string
name: unpack_data
arguments: data_tag: D75
datatype: string
name: unpack_data
arguments: data_tag: D47
datatype: string
name: unpack_data
arguments: data_tag: D54
datatype: string
name: unpack_data
arguments: data_tag: D58
datatype: string
name: unpack_data
arguments: data_tag: D88
datatype: string

tool: D20: ERROR: incorrect sfo signature


tool: D12: ERROR: sfo information is too small


tool: D35: TITLE

tool: D39: STITLE

tool: D22: CONTENT_ID

tool: D75: CATEGORY

tool: D47: PSP2_DISP_VER

tool: D54: APP_VER

tool: D58: ERROR: cannot find title from sfo file, pkg is probably corrupted


tool: D88: <>"/\|?*

assistant: ```c
void parse_sfo_content(const uint8_t *sfo, uint32_t sfo_size, char *category, char *title, char *content, char *min_version, char *pkg_version) {
  if (get32le(sfo) != 0x46535000) {
    sys_error("ERROR: incorrect sfo signature\n");
  }
  uint32_t keys = get32le(sfo + 8);
  uint32_t values = get32le(sfo + 12);
  uint32_t count = get32le(sfo + 16);
  int title_index = -1;
  int content_index = -1;
  int category_index = -1;
  int minver_index = -1;
  int pkgver_index = -1;
  for (uint32_t i = 0; i < count; i++) {
    if (i * 16 + 20 + 2 > sfo_size) {
      sys_error("ERROR: sfo information is too small\n");
    }
    char *key = (char *)sfo + keys + get16le(sfo + i * 16 + 20);
    if (strcmp(key, "TITLE") == 0) {
      if (title_index < 0) {
        title_index = (int)i;
      }
    } else if (strcmp(key, "STITLE") == 0) {
      title_index = (int)i;
    } else if (strcmp(key, "CONTENT_ID") == 0) {
      content_index = (int)i;
    } else if (strcmp(key, "CATEGORY") == 0) {
      category_index = (int)i;
    } else if (strcmp(key, "PSP2_DISP_VER") == 0) {
      minver_index = (int)i;
    } else if (strcmp(key, "APP_VER") == 0) {
      pkgver_index = (int)i;
    }
  }
  if (title_index < 0) {
    sys_error("ERROR: cannot find title from sfo file, pkg is probably corrupted\n");
  }
  char *value = (char *)sfo + values + get32le(sfo + title_index * 16 + 20 + 12);
  size_t i;
  size_t max = 255;
  for (i = 0; i < max && *value; i++, value++) {
    if ((*value >= 32 && *value < 127 && strchr("<>\"/\\|?*", *value) == NULL) || (uint8_t)*value >= 128) {
      if (*value == ':') {
        *title++ = ' ';
        *title++ = '-';
        max--;
      } else {
        *title++ = *value;
      }
    } else if (*value == 10) {
      *title++ = ' ';
    }
  }
  *title = 0;
  if (content_index >= 0 && content) {
    value = (char *)sfo + values + get32le(sfo + content_index * 16 + 20 + 12);
    while (*value) {
      *content++ = *value++;
    }
    *content = 0;
  }
  if (category_index >= 0) {
    value = (char *)sfo + values + get32le(sfo + category_index * 16 + 20 + 12);
    while (*value) {
      *category++ = *value++;
    }
  }
  *category = 0;
  if (minver_index >= 0 && min_version) {
    value = (char *)sfo + values + get32le(sfo + minver_index * 16 + 20 + 12);
    if (*value == '0') {
      value++;
    }
    while (*value) {
      *min_version++ = *value++;
    }
    if (min_version[-1] == '0') {
      min_version[-1] = 0;
    } else {
      *min_version = 0;
    }
  }
  if (pkgver_index >= 0 && pkg_version) {
    value = (char *)sfo + values + get32le(sfo + pkgver_index * 16 + 20 + 12);
    if (*value == '0') {
      value++;
    }
    while (*value) {
      *pkg_version++ = *value++;
    }
    *pkg_version = 0;
  }
}
```