user: 下面的汇编指令对应的C源代码是什么:

```asm
<pretty_freespace>:
  endbr64
  push   %r14
  mov    %rdi,%r14
  push   %r13
  mov    %rdx,%r13
  push   %r12
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  sub    $0x60,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x58(%rsp)
  lea    D86(%rip),%rax
  movq   $0x0,0x50(%rsp)
  mov    %rax,0x10(%rsp)
  lea    D60(%rip),%rax
  mov    %rax,0x18(%rsp)
  lea    D98(%rip),%rax
  mov    %rax,0x20(%rsp)
  lea    D20(%rip),%rax
  mov    %rax,0x28(%rsp)
  lea    D27(%rip),%rax
  mov    %rax,0x30(%rsp)
  lea    D132(%rip),%rax
  mov    %rax,0x38(%rsp)
  lea    D67(%rip),%rax
  mov    %rax,0x40(%rsp)
  lea    D44(%rip),%rax
  mov    %rax,0x48(%rsp)
  mov    (%rsi),%rax
  test   %rax,%rax
  js     L30
  pxor   %xmm0,%xmm0
  cvtsi2sd %rax,%xmm0
L67:
  mov    0x0(%r13),%rax
  test   %rax,%rax
  js     L64
  pxor   %xmm1,%xmm1
  cvtsi2sd %rax,%xmm1
L114:
  mov    $0x400,%edi
  movsd  %xmm1,0x8(%rsp)
  movsd  %xmm0,(%rsp)
  call   <malloc@plt>
  movsd  0x8(%rsp),%xmm1
  movsd  (%rsp),%xmm0
  ucomisd D2(%rip),%xmm1
  mov    %rax,%r12
  jp     L22
  je     L48
L22:
  movsd  D136(%rip),%xmm3
  movsd  D45(%rip),%xmm2
  lea    0x10(%rsp),%rbx
  comisd %xmm3,%xmm1
  jbe    L110
  nopl   0x0(%rax)
L98:
  mulsd  %xmm2,%xmm1
  add    $0x8,%rbx
  mulsd  %xmm2,%xmm0
  comisd %xmm3,%xmm1
  jbe    L110
  cmpq   $0x0,0x8(%rbx)
  jne    L98
L110:
  xor    %eax,%eax
  movsd  %xmm1,0x8(%rsp)
  movsd  %xmm0,(%rsp)
  call   <sysinfo_get_percent@plt>
  movsd  (%rsp),%xmm0
  movsd  0x8(%rsp),%xmm1
  test   %eax,%eax
  jne    L85
  mov    (%rbx),%r8
  mov    %r14,%rcx
  lea    D75(%rip),%rdx
  mov    %r12,%rdi
  mov    $0x400,%esi
  mov    $0x2,%eax
  mov    %r8,%r9
  call   <snprintf@plt>
L38:
  mov    0x58(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L25
  add    $0x60,%rsp
  mov    %r12,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L85:
  mov    %r13,%rsi
  mov    %rbp,%rdi
  xor    %eax,%eax
  movsd  %xmm1,(%rsp)
  call   <percentage@plt>
  movsd  (%rsp),%xmm1
  mov    (%rbx),%r8
  mov    %r14,%rcx
  mov    %eax,%r9d
  mov    $0x400,%esi
  mov    %r12,%rdi
  mov    $0x1,%eax
  movapd %xmm1,%xmm0
  lea    D63(%rip),%rdx
  call   <snprintf@plt>
  jmp    L38
  nop
L64:
  mov    %rax,%rdx
  and    $0x1,%eax
  pxor   %xmm1,%xmm1
  shr    %rdx
  or     %rax,%rdx
  cvtsi2sd %rdx,%xmm1
  addsd  %xmm1,%xmm1
  jmp    L114
  xchg   %ax,%ax
L30:
  mov    %rax,%rdx
  and    $0x1,%eax
  pxor   %xmm0,%xmm0
  shr    %rdx
  or     %rax,%rdx
  cvtsi2sd %rdx,%xmm0
  addsd  %xmm0,%xmm0
  jmp    L67
  xchg   %ax,%ax
L48:
  mov    %rax,%rdi
  mov    %r14,%rcx
  mov    $0x400,%esi
  xor    %eax,%eax
  lea    D108(%rip),%rdx
  call   <snprintf@plt>
  jmp    L38
L25:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: tag: D86
data_type: string
name: disassemble_data
arguments: tag: D60
data_type: string
name: disassemble_data
arguments: tag: D98
data_type: string
name: disassemble_data
arguments: tag: D20
data_type: string
name: disassemble_data
arguments: tag: D27
data_type: string
name: disassemble_data
arguments: tag: D132
data_type: string
name: disassemble_data
arguments: tag: D67
data_type: string
name: disassemble_data
arguments: tag: D44
data_type: string
name: disassemble_data
arguments: tag: D2
data_type: byte[8]
name: disassemble_data
arguments: tag: D136
data_type: byte[8]
name: disassemble_data
arguments: tag: D45
data_type: byte[8]
name: disassemble_data
arguments: tag: D75
data_type: string
name: disassemble_data
arguments: tag: D63
data_type: string
name: disassemble_data
arguments: tag: D108
data_type: string

tool: D86: KiB

tool: D60: MiB

tool: D98: GiB

tool: D20: TiB

tool: D27: PiB

tool: D132: EiB

tool: D67: ZiB

tool: D44: YiB

tool: {"D2": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]}

tool: {"D136": [0x00,0x00,0x00,0x00,0x00,0xf8,0x8f,0x40]}

tool: {"D45": [0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x3f]}

tool: D75: %s: %.1f%s/%.1f%s free

tool: D63: %s: %.1f%s, %.1f%% free

tool: D108: %s: none

assistant: ```c
char *pretty_freespace(const char *desc, unsigned long long *free_k, unsigned long long *total_k) {
  char *quantities[] = {"KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB", 0};
  char *result, **quantity;
  double free_space, total_space;
  free_space = *free_k;
  total_space = *total_k;
  result = malloc(1024 * sizeof(char));
  if (total_space == 0) {
    snprintf(result, 1024, "%s: none", desc);
    return result;
  }
  quantity = quantities;
  while (total_space > 1023 && *(quantity + 1)) {
    quantity++;
    free_space = free_space / 1024;
    total_space = total_space / 1024;
  }
  if (sysinfo_get_percent() != 0)
    snprintf(result, 1024, "%s: %.1f%s, %.1f%% free", desc, total_space, *quantity, percentage(free_k, total_k));
  else
    snprintf(result, 1024, "%s: %.1f%s/%.1f%s free", desc, free_space, *quantity, total_space, *quantity);
  return result;
}
```