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

```asm
<get_pdb_fields>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x78,%rsp
  mov    %rdi,%rbx
  mov    %esi,0xc(%rsp)
  mov    %rdx,0x10(%rsp)
  mov    %rcx,%rbp
  mov    %r8,%r15
  mov    %r9,0x18(%rsp)
  mov    0xb0(%rsp),%rcx
  mov    %rcx,0x20(%rsp)
  mov    0xb8(%rsp),%r13
  mov    0xc0(%rsp),%r14
  mov    0xc8(%rsp),%r12
  mov    0xd0(%rsp),%rcx
  mov    %rcx,0x28(%rsp)
  mov    0xd8(%rsp),%rcx
  mov    %rcx,0x30(%rsp)
  mov    0xe0(%rsp),%r11
  mov    %r11,0x38(%rsp)
  mov    0xe8(%rsp),%r8
  mov    %r8,0x40(%rsp)
  mov    0xf0(%rsp),%rax
  mov    %rax,0x48(%rsp)
  mov    0xf8(%rsp),%r11
  mov    %r11,0x50(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x68(%rsp)
  xor    %eax,%eax
  lea    0x6(%rdi),%rsi
  lea    0x62(%rsp),%rax
  mov    $0x5,%edx
  mov    %rax,0x58(%rsp)
  mov    %rax,%rdi
  call   <strncpy@plt>
  movb   $0x0,0x67(%rsp)
  mov    0x10(%rsp),%r10
  movl   $0x0,(%r10)
  mov    %r10,%rdx
  lea    D4(%rip),%rsi
  mov    0x58(%rsp),%rdi
  call   <sscanf@plt>
  lea    0xc(%rbx),%rsi
  mov    $0x4,%edx
  mov    %rbp,%rdi
  call   <strncpy@plt>
  movb   $0x0,0x4(%rbp)
  mov    %rbp,%rdi
  call   <adjust_pdb_field_string@plt>
  lea    0x10(%rbx),%rsi
  mov    $0x1,%edx
  mov    %r12,%rdi
  call   <strncpy@plt>
  movb   $0x0,0x1(%r12)
  lea    0x11(%rbx),%rsi
  mov    $0x4,%edx
  mov    %r15,%rdi
  call   <strncpy@plt>
  movb   $0x0,0x4(%r15)
  mov    %r15,%rdi
  call   <adjust_pdb_field_string@plt>
  movzbl 0x15(%rbx),%eax
  mov    0x18(%rsp),%rdi
  mov    %al,(%rdi)
  movb   $0x0,0x1(%rdi)
  lea    0x16(%rbx),%rsi
  mov    $0x4,%edx
  mov    %r13,%rdi
  call   <strncpy@plt>
  movb   $0x0,0x4(%r13)
  mov    %r13,%rdi
  call   <adjust_pdb_field_string@plt>
  movzbl 0x1a(%rbx),%eax
  mov    %al,(%r14)
  movb   $0x0,0x1(%r14)
  mov    0x50(%rsp),%r9
  mov    0x48(%rsp),%r8
  mov    0x40(%rsp),%rcx
  mov    0x38(%rsp),%rdx
  mov    0x30(%rsp),%rsi
  mov    %rbx,%rdi
  call   <get_pdb_coordinates@plt>
  cmpl   $0x48,0xc(%rsp)
  jg     L38
  mov    0x20(%rsp),%rax
  movb   $0x0,(%rax)
L39:
  mov    0x28(%rsp),%rax
  movb   $0x0,(%rax)
L10:
  mov    0x68(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L2
  add    $0x78,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L38:
  lea    0x48(%rbx),%rsi
  mov    $0x4,%edx
  mov    0x20(%rsp),%r14
  mov    %r14,%rdi
  call   <strncpy@plt>
  movb   $0x0,0x4(%r14)
  mov    %r14,%rdi
  call   <adjust_pdb_field_string@plt>
  cmpl   $0x4c,0xc(%rsp)
  jle    L39
  lea    0x4c(%rbx),%rsi
  mov    $0x2,%edx
  mov    0x28(%rsp),%rbx
  mov    %rbx,%rdi
  call   <strncpy@plt>
  movb   $0x0,0x2(%rbx)
  jmp    L10
L2:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: data_tag: D4
datatype: string

tool: D4: %5d

assistant: ```c
void get_pdb_fields(const char *record, int reclength, int *serial, char *name, char *resname, char *chain, char *segname, char *resid, char *insertion, char *altloc, char *elementsymbol, float *x, float *y, float *z, float *occup, float *beta) {
  char serialbuf[6];
  strncpy(serialbuf, record + 6, 5);
  serialbuf[5] = '\0';
  *serial = 0;
  sscanf(serialbuf, "%5d", serial);
  strncpy(name, record + 12, 4);
  name[4] = '\0';
  adjust_pdb_field_string(name);
  strncpy(altloc, record + 16, 1);
  altloc[1] = '\0';
  strncpy(resname, record + 17, 4);
  resname[4] = '\0';
  adjust_pdb_field_string(resname);
  chain[0] = record[21];
  chain[1] = '\0';
  strncpy(resid, record + 22, 4);
  resid[4] = '\0';
  adjust_pdb_field_string(resid);
  insertion[0] = record[26];
  insertion[1] = '\0';
  get_pdb_coordinates(record, x, y, z, occup, beta);
  if (reclength >= 73) {
    strncpy(segname, record + 72, 4);
    segname[4] = '\0';
    adjust_pdb_field_string(segname);
  } else {
    segname[0] = '\0';
  }
  if (reclength >= 77) {
    strncpy(elementsymbol, record + 76, 2);
    elementsymbol[2] = '\0';
  } else {
    elementsymbol[0] = '\0';
  }
}
```