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

```asm
<test_get_both_parts>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movsd  D64(%rip),%xmm0
  movsd  %xmm0,-0x70(%rbp)
  movsd  D36(%rip),%xmm0
  movsd  %xmm0,-0x68(%rbp)
  movsd  D3(%rip),%xmm0
  movsd  %xmm0,-0x60(%rbp)
  movsd  D110(%rip),%xmm0
  movsd  %xmm0,-0x58(%rbp)
  movsd  D107(%rip),%xmm0
  movsd  %xmm0,-0x50(%rbp)
  movsd  D112(%rip),%xmm0
  movsd  %xmm0,-0x48(%rbp)
  movsd  D82(%rip),%xmm0
  movsd  %xmm0,-0x40(%rbp)
  movsd  D34(%rip),%xmm0
  movsd  %xmm0,-0x38(%rbp)
  movsd  D126(%rip),%xmm0
  movsd  %xmm0,-0x30(%rbp)
  movsd  D131(%rip),%xmm0
  movsd  %xmm0,-0x28(%rbp)
  movsd  D0(%rip),%xmm0
  movsd  %xmm0,-0x20(%rbp)
  movsd  D5(%rip),%xmm0
  movsd  %xmm0,-0x18(%rbp)
  movl   $0x4,-0x84(%rbp)
  lea    -0x80(%rbp),%rdx
  mov    -0x84(%rbp),%ecx
  lea    -0x70(%rbp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <get_both_parts@plt>
  mov    %rax,-0x78(%rbp)
  movl   $0x0,-0x88(%rbp)
  jmp    L18
L23:
  mov    -0x88(%rbp),%eax
  cltq
  movsd  -0x50(%rbp,%rax,8),%xmm0
  mov    -0x88(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x78(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  lea    D135(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x88(%rbp),%eax
  cltq
  movsd  -0x30(%rbp,%rax,8),%xmm0
  mov    -0x80(%rbp),%rdx
  mov    -0x88(%rbp),%eax
  cltq
  shl    $0x3,%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  lea    D135(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x88(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x78(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mov    -0x88(%rbp),%eax
  cltq
  movsd  -0x50(%rbp,%rax,8),%xmm1
  ucomisd %xmm1,%xmm0
  setnp  %al
  mov    $0x0,%edx
  ucomisd %xmm1,%xmm0
  cmovne %edx,%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x80(%rbp),%rdx
  mov    -0x88(%rbp),%eax
  cltq
  shl    $0x3,%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mov    -0x88(%rbp),%eax
  cltq
  movsd  -0x30(%rbp,%rax,8),%xmm1
  ucomisd %xmm1,%xmm0
  setnp  %al
  mov    $0x0,%edx
  ucomisd %xmm1,%xmm0
  cmovne %edx,%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  addl   $0x1,-0x88(%rbp)
L18:
  mov    -0x88(%rbp),%eax
  cmp    -0x84(%rbp),%eax
  jl     L23
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L10
  call   <__stack_chk_fail@plt>
L10:
  leave
  ret
```

tool_calls: name: read_data
arguments: label: D64
type: f64
name: read_data
arguments: label: D36
type: f64
name: read_data
arguments: label: D3
type: f64
name: read_data
arguments: label: D110
type: f64
name: read_data
arguments: label: D107
type: byte[8]
name: read_data
arguments: label: D112
type: byte[8]
name: read_data
arguments: label: D82
type: byte[8]
name: read_data
arguments: label: D34
type: byte[8]
name: read_data
arguments: label: D126
type: f64
name: read_data
arguments: label: D131
type: f64
name: read_data
arguments: label: D0
type: f64
name: read_data
arguments: label: D5
type: f64
name: read_data
arguments: label: D135
type: string

tool: D64: 1.2

tool: D36: 2.718

tool: D3: 3.14159

tool: D110: 5.6

tool: {"D107": [0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f]}

tool: {"D112": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40]}

tool: {"D82": [0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x40]}

tool: {"D34": [0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x40]}

tool: D126: 0.2

tool: D131: 0.718

tool: D0: 0.14159

tool: D5: 0.6

tool: D135: %.18lf  %.18lf


assistant: ```c
void test_get_both_parts() {
  double array[] = {1.2, 2.718, 3.14159, 5.6};
  double expected_int[] = {1, 2, 3, 5};
  double expected_frac[] = {0.2, 0.718, 0.14159, 0.6};
  double *frac_part;
  int length = sizeof(array) / sizeof(double);
  double *int_part = get_both_parts(array, length, &frac_part);
  for (int i = 0; i < length; i++) {
    printf("%.18lf  %.18lf\n", int_part[i], expected_int[i]);
    printf("%.18lf  %.18lf\n", frac_part[i], expected_frac[i]);
    assert(int_part[i] == expected_int[i]);
    assert(frac_part[i] == expected_frac[i]);
  }
}
```