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

```asm
<get_asn_db_info>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    %rcx,-0x30(%rbp)
  mov    %r8,-0x38(%rbp)
  mov    %r9,-0x40(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0xc(%rbp)
  cmpl   $0xb,-0x1c(%rbp)
  jne    L103
  mov    -0x28(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <get_asn_int@plt>
  mov    %rax,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  jmp    L114
L87:
  addq   $0x2,-0x18(%rbp)
  addl   $0x1,-0xc(%rbp)
L103:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x30,%al
  je     L87
  cmpl   $0x11,-0x1c(%rbp)
  ja     L46
  mov    -0x1c(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  lea    D16(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D16(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    -0x40(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    0x10(%rbp),%rdx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <get_asn_local_id@plt>
  mov    %rax,-0x18(%rbp)
  jmp    L96
  mov    -0x28(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <get_asn_int@plt>
  mov    %rax,-0x18(%rbp)
  jmp    L96
  mov    -0x18(%rbp),%rax
  lea    0x2(%rax),%rdx
  mov    -0x28(%rbp),%rax
  mov    %rax,%rsi
  mov    %rdx,%rdi
  call   <get_asn_int@plt>
  mov    %rax,-0x18(%rbp)
  jmp    L96
  mov    -0x40(%rbp),%rcx
  mov    -0x38(%rbp),%rdx
  mov    -0x30(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  mov    0x10(%rbp),%r8
  mov    %rax,%rdi
  call   <get_asn_textseq_id@plt>
  mov    %rax,-0x18(%rbp)
  jmp    L96
  lea    -0x10(%rbp),%rdi
  mov    -0x40(%rbp),%rcx
  mov    -0x38(%rbp),%rdx
  mov    -0x30(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  mov    %rdi,%r9
  mov    0x10(%rbp),%r8
  mov    %rax,%rdi
  call   <get_asn_dbtag@plt>
  mov    %rax,-0x18(%rbp)
  jmp    L96
  mov    -0x38(%rbp),%rcx
  mov    -0x30(%rbp),%rdx
  mov    -0x40(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  mov    %rcx,%r8
  mov    %rdx,%rcx
  mov    0x10(%rbp),%rdx
  mov    %rax,%rdi
  call   <get_asn_pdb_id@plt>
  mov    %rax,-0x18(%rbp)
  jmp    L96
L46:
  addq   $0x2,-0x18(%rbp)
L96:
  jmp    L78
L61:
  addq   $0x4,-0x18(%rbp)
L78:
  mov    -0xc(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0xc(%rbp)
  test   %eax,%eax
  jg     L61
  mov    -0x18(%rbp),%rax
L114:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L84
  call   <__stack_chk_fail@plt>
L84:
  leave
  ret
```

assistant: ```c
unsigned char *get_asn_db_info(unsigned char *abp, int db_type, int *gi_p, char *name, size_t name_len, char *acc, size_t acc_len) {
  int seq_cnt = 0, itmp;
  if (db_type == 11) {
    abp = get_asn_int(abp, gi_p);
    return abp;
  }
  while (*abp == 0x30) {
    abp += 2;
    seq_cnt++;
  }
  switch (db_type) {
  case 0:
    abp = get_asn_local_id(abp, acc, acc_len);
    break;
  case 1:
  case 2:
    abp = get_asn_int(abp, gi_p);
    break;
  case 11:
    abp = get_asn_int(abp + 2, gi_p);
    break;
  case 4:
  case 5:
  case 6:
  case 7:
  case 9:
  case 12:
  case 13:
  case 15:
  case 16:
  case 17:
    abp = get_asn_textseq_id(abp, name, name_len, acc, acc_len);
    break;
  case 10:
    abp = get_asn_dbtag(abp, name, name_len, acc, acc_len, &itmp);
    break;
  case 14:
    abp = get_asn_pdb_id(abp, acc, acc_len, name, name_len);
    break;
  default:
    abp += 2;
  }
  while (seq_cnt-- > 0) {
    abp += 4;
  }
  return abp;
}
```