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

```asm
<string_format_size>:
  endbr64
  push   %rbp
  push   %rbx
  sub    $0x168,%rsp
  mov    %rdi,%rbx
  mov    %fs:0x28,%rax
  mov    %rax,0x158(%rsp)
  xor    %eax,%eax
  lea    D44(%rip),%rax
  mov    %rax,0x10(%rsp)
  lea    D3(%rip),%rax
  mov    %rax,0x18(%rsp)
  lea    D18(%rip),%rax
  mov    %rax,0x20(%rsp)
  lea    D39(%rip),%rax
  mov    %rax,0x28(%rsp)
  lea    D27(%rip),%rax
  mov    %rax,0x38(%rsp)
  lea    D4(%rip),%rax
  mov    %rax,0x40(%rsp)
  mov    %rax,0x48(%rsp)
  movl   $0x3f800000,(%rsp)
  movl   $0x44800000,0x4(%rsp)
  movl   $0x49800000,0x8(%rsp)
  movl   $0x4e800000,0xc(%rsp)
  movb   $0x0,0xd0(%rsp)
  cmp    $0x27ff,%rdi
  jbe    L64
  mov    $0x1,%ebp
  cmp    $0xfffff,%rdi
  jbe    L65
  cmp    $0x3fffffff,%rdi
  seta   %bpl
  movzbl %bpl,%ebp
  add    $0x2,%ebp
L65:
  movslq %ebp,%rax
  mov    0x30(%rsp,%rax,8),%rcx
  lea    0x50(%rsp),%rdi
  lea    D91(%rip),%rdx
  mov    $0x80,%esi
  mov    $0x0,%eax
  call   <snprintf@plt>
L51:
  movslq %ebp,%rax
  mov    0x10(%rsp,%rax,8),%rcx
L29:
  test   %rbx,%rbx
  js     L28
  pxor   %xmm0,%xmm0
  cvtsi2ss %rbx,%xmm0
L66:
  movslq %ebp,%rbp
  divss  (%rsp,%rbp,4),%xmm0
  cvtss2sd %xmm0,%xmm0
  lea    0x50(%rsp),%rdx
  lea    0xd0(%rsp),%rbx
  mov    $0x80,%esi
  mov    %rbx,%rdi
  mov    $0x1,%eax
  call   <snprintf@plt>
  mov    %rbx,%rdi
  call   <strdup@plt>
  mov    0x158(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L55
  add    $0x168,%rsp
  pop    %rbx
  pop    %rbp
  ret
L64:
  lea    0x50(%rsp),%rdi
  lea    D74(%rip),%rcx
  lea    D91(%rip),%rdx
  mov    $0x80,%esi
  mov    $0x0,%eax
  call   <snprintf@plt>
  mov    $0x0,%ebp
  lea    D52(%rip),%rcx
  cmp    $0x1,%rbx
  jbe    L29
  jmp    L51
L28:
  mov    %rbx,%rax
  shr    %rax
  and    $0x1,%ebx
  or     %rbx,%rax
  pxor   %xmm0,%xmm0
  cvtsi2ss %rax,%xmm0
  addss  %xmm0,%xmm0
  jmp    L66
L55:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: data_label: D44
type: string
name: parse_data
arguments: data_label: D3
type: string
name: parse_data
arguments: data_label: D18
type: string
name: parse_data
arguments: data_label: D39
type: string
name: parse_data
arguments: data_label: D27
type: string
name: parse_data
arguments: data_label: D4
type: string
name: parse_data
arguments: data_label: D91
type: string
name: parse_data
arguments: data_label: D74
type: string
name: parse_data
arguments: data_label: D52
type: string

tool: D44: bytes

tool: D3: KB

tool: D18: MB

tool: D39: GB

tool: D27: %.1f

tool: D4: %.02f

tool: D91: %s %%s

tool: D74: %.0f

tool: D52: byte

assistant: ```c
char *string_format_size(unsigned long size) {
  char *unit_name[] = {("bytes"), ("KB"), ("MB"), ("GB")};
  char *unit_format[] = {"%.0f", "%.1f", "%.02f", "%.02f"};
  float unit_divide[] = {1, 1024, 1024 * 1024, 1024 * 1024 * 1024};
  char format_size[128], str_size[128];
  int num_unit;
  str_size[0] = '\0';
  if (size < 1024 * 10)
    num_unit = 0;
  else if (size < 1024 * 1024)
    num_unit = 1;
  else if (size < 1024 * 1024 * 1024)
    num_unit = 2;
  else
    num_unit = 3;
  snprintf(format_size, sizeof(format_size), "%s %%s", unit_format[num_unit]);
  snprintf(str_size, sizeof(str_size), format_size, ((float)size) / ((float)(unit_divide[num_unit])), (size <= 1) ? ("byte") : (unit_name[num_unit]));
  return strdup(str_size);
}
```