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

```asm
<test_get_both_parts>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  add    $0xffffffffffffff80,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x78(%rsp)
  xor    %eax,%eax
  mov    D112(%rip),%rax
  mov    %rax,0x10(%rsp)
  mov    D44(%rip),%rax
  mov    %rax,0x18(%rsp)
  mov    D27(%rip),%rax
  mov    %rax,0x20(%rsp)
  mov    D99(%rip),%rax
  mov    %rax,0x28(%rsp)
  mov    D16(%rip),%rax
  mov    %rax,0x30(%rsp)
  mov    D69(%rip),%rax
  mov    %rax,0x38(%rsp)
  mov    D89(%rip),%rax
  mov    %rax,0x40(%rsp)
  mov    D39(%rip),%rax
  mov    %rax,0x48(%rsp)
  mov    D96(%rip),%rax
  mov    %rax,0x50(%rsp)
  mov    D60(%rip),%rax
  mov    %rax,0x58(%rsp)
  mov    D13(%rip),%rax
  mov    %rax,0x60(%rsp)
  mov    D70(%rip),%rax
  mov    %rax,0x68(%rsp)
  lea    0x8(%rsp),%rdx
  lea    0x10(%rsp),%rdi
  mov    $0x4,%esi
  call   <get_both_parts@plt>
  mov    %rax,%rbp
  mov    $0x0,%ebx
  lea    D17(%rip),%r12
L0:
  mov    0x30(%rsp,%rbx,1),%r13
  movsd  0x0(%rbp,%rbx,1),%xmm0
  movq   %r13,%xmm1
  mov    %r12,%rdi
  call   <printf@plt>
  mov    0x50(%rsp,%rbx,1),%r14
  mov    0x8(%rsp),%rax
  movsd  (%rax,%rbx,1),%xmm0
  movq   %r14,%xmm1
  mov    %r12,%rdi
  call   <printf@plt>
  movq   %r13,%xmm2
  ucomisd 0x0(%rbp,%rbx,1),%xmm2
  setnp  %dil
  movzbl %dil,%edi
  mov    $0x0,%r13d
  cmovne %r13d,%edi
  call   <assert@plt>
  mov    0x8(%rsp),%rax
  movq   %r14,%xmm3
  ucomisd (%rax,%rbx,1),%xmm3
  setnp  %dil
  movzbl %dil,%edi
  cmovne %r13d,%edi
  call   <assert@plt>
  add    $0x8,%rbx
  cmp    $0x20,%rbx
  jne    L0
  mov    0x78(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L11
  sub    $0xffffffffffffff80,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L11:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: tag: D112
data_type: f64
name: retrieve_data
arguments: tag: D44
data_type: f64
name: retrieve_data
arguments: tag: D27
data_type: f64
name: retrieve_data
arguments: tag: D99
data_type: f64
name: retrieve_data
arguments: tag: D16
data_type: byte[8]
name: retrieve_data
arguments: tag: D69
data_type: byte[8]
name: retrieve_data
arguments: tag: D89
data_type: byte[8]
name: retrieve_data
arguments: tag: D39
data_type: byte[8]
name: retrieve_data
arguments: tag: D96
data_type: f64
name: retrieve_data
arguments: tag: D60
data_type: f64
name: retrieve_data
arguments: tag: D13
data_type: f64
name: retrieve_data
arguments: tag: D70
data_type: f64
name: retrieve_data
arguments: tag: D17
data_type: string

tool: D112: 1.2

tool: D44: 2.718

tool: D27: 3.14159

tool: D99: 5.6

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

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

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

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

tool: D96: 0.2

tool: D60: 0.718

tool: D13: 0.14159

tool: D70: 0.6

tool: D17: %.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]);
  }
}
```