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

```asm
<nuclear_attraction>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xc0,%rsp
  movsd  %xmm0,-0x68(%rbp)
  movsd  %xmm1,-0x70(%rbp)
  movsd  %xmm2,-0x78(%rbp)
  movsd  %xmm3,-0x80(%rbp)
  mov    %edi,-0x84(%rbp)
  mov    %esi,-0x88(%rbp)
  mov    %edx,-0x8c(%rbp)
  movsd  %xmm4,-0x98(%rbp)
  movsd  %xmm5,-0xa0(%rbp)
  movsd  %xmm6,-0xa8(%rbp)
  movsd  %xmm7,-0xb0(%rbp)
  mov    %ecx,-0x90(%rbp)
  mov    %r8d,-0xb4(%rbp)
  mov    %r9d,-0xb8(%rbp)
  movsd  -0x98(%rbp),%xmm0
  addsd  0x18(%rbp),%xmm0
  movsd  %xmm0,-0x48(%rbp)
  movsd  -0xa0(%rbp),%xmm2
  movsd  0x18(%rbp),%xmm1
  movsd  -0x68(%rbp),%xmm0
  mov    -0x98(%rbp),%rax
  movapd %xmm2,%xmm3
  movapd %xmm1,%xmm2
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <product_center_1D@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x40(%rbp)
  movsd  -0xa8(%rbp),%xmm2
  movsd  0x18(%rbp),%xmm1
  movsd  -0x70(%rbp),%xmm0
  mov    -0x98(%rbp),%rax
  movapd %xmm2,%xmm3
  movapd %xmm1,%xmm2
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <product_center_1D@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x38(%rbp)
  movsd  -0xb0(%rbp),%xmm2
  movsd  0x18(%rbp),%xmm1
  movsd  -0x78(%rbp),%xmm0
  mov    -0x98(%rbp),%rax
  movapd %xmm2,%xmm3
  movapd %xmm1,%xmm2
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <product_center_1D@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x30(%rbp)
  movsd  -0xb0(%rbp),%xmm4
  movsd  -0xa8(%rbp),%xmm3
  movsd  -0xa0(%rbp),%xmm2
  movsd  -0x78(%rbp),%xmm1
  movsd  -0x70(%rbp),%xmm0
  mov    -0x68(%rbp),%rax
  movapd %xmm4,%xmm5
  movapd %xmm3,%xmm4
  movapd %xmm2,%xmm3
  movapd %xmm1,%xmm2
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <dist2@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x28(%rbp)
  movsd  -0x30(%rbp),%xmm4
  movsd  -0x38(%rbp),%xmm3
  movsd  -0x40(%rbp),%xmm2
  movsd  0x30(%rbp),%xmm1
  movsd  0x28(%rbp),%xmm0
  mov    0x20(%rbp),%rax
  movapd %xmm4,%xmm5
  movapd %xmm3,%xmm4
  movapd %xmm2,%xmm3
  movapd %xmm1,%xmm2
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <dist2@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x20(%rbp)
  movsd  -0x40(%rbp),%xmm0
  movapd %xmm0,%xmm2
  subsd  0x20(%rbp),%xmm2
  movsd  -0x40(%rbp),%xmm0
  movapd %xmm0,%xmm1
  subsd  -0xa0(%rbp),%xmm1
  movsd  -0x40(%rbp),%xmm0
  subsd  -0x68(%rbp),%xmm0
  movq   %xmm0,%rcx
  movsd  -0x48(%rbp),%xmm0
  mov    -0x90(%rbp),%edx
  mov    -0x84(%rbp),%eax
  movapd %xmm0,%xmm3
  movq   %rcx,%xmm0
  mov    %edx,%esi
  mov    %eax,%edi
  call   <A_array@plt>
  mov    %rax,-0x18(%rbp)
  movsd  -0x38(%rbp),%xmm0
  movapd %xmm0,%xmm2
  subsd  0x28(%rbp),%xmm2
  movsd  -0x38(%rbp),%xmm0
  movapd %xmm0,%xmm1
  subsd  -0xa8(%rbp),%xmm1
  movsd  -0x38(%rbp),%xmm0
  subsd  -0x70(%rbp),%xmm0
  movq   %xmm0,%rcx
  movsd  -0x48(%rbp),%xmm0
  mov    -0xb4(%rbp),%edx
  mov    -0x88(%rbp),%eax
  movapd %xmm0,%xmm3
  movq   %rcx,%xmm0
  mov    %edx,%esi
  mov    %eax,%edi
  call   <A_array@plt>
  mov    %rax,-0x10(%rbp)
  movsd  -0x30(%rbp),%xmm0
  movapd %xmm0,%xmm2
  subsd  0x30(%rbp),%xmm2
  movsd  -0x30(%rbp),%xmm0
  movapd %xmm0,%xmm1
  subsd  -0xb0(%rbp),%xmm1
  movsd  -0x30(%rbp),%xmm0
  subsd  -0x78(%rbp),%xmm0
  movq   %xmm0,%rcx
  movsd  -0x48(%rbp),%xmm0
  mov    -0xb8(%rbp),%edx
  mov    -0x8c(%rbp),%eax
  movapd %xmm0,%xmm3
  movq   %rcx,%xmm0
  mov    %edx,%esi
  mov    %eax,%edi
  call   <A_array@plt>
  mov    %rax,-0x8(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x50(%rbp)
  movl   $0x0,-0x5c(%rbp)
  jmp    L38
L50:
  movl   $0x0,-0x58(%rbp)
  jmp    L34
L30:
  movl   $0x0,-0x54(%rbp)
  jmp    L35
L51:
  mov    -0x5c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x58(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0x54(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm0,%xmm1
  movsd  %xmm1,-0xc0(%rbp)
  movsd  -0x20(%rbp),%xmm0
  mulsd  -0x48(%rbp),%xmm0
  movq   %xmm0,%rax
  mov    -0x5c(%rbp),%ecx
  mov    -0x58(%rbp),%edx
  add    %edx,%ecx
  mov    -0x54(%rbp),%edx
  add    %ecx,%edx
  movq   %rax,%xmm0
  mov    %edx,%edi
  call   <Fgamma@plt>
  mulsd  -0xc0(%rbp),%xmm0
  movsd  -0x50(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x50(%rbp)
  addl   $0x1,-0x54(%rbp)
L35:
  mov    -0x8c(%rbp),%edx
  mov    -0xb8(%rbp),%eax
  add    %edx,%eax
  cmp    %eax,-0x54(%rbp)
  jle    L51
  addl   $0x1,-0x58(%rbp)
L34:
  mov    -0x88(%rbp),%edx
  mov    -0xb4(%rbp),%eax
  add    %edx,%eax
  cmp    %eax,-0x58(%rbp)
  jle    L30
  addl   $0x1,-0x5c(%rbp)
L38:
  mov    -0x84(%rbp),%edx
  mov    -0x90(%rbp),%eax
  add    %edx,%eax
  cmp    %eax,-0x5c(%rbp)
  jle    L50
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x10(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  movsd  -0x80(%rbp),%xmm0
  movq   D12(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  mulsd  0x10(%rbp),%xmm0
  movapd %xmm0,%xmm1
  addsd  %xmm0,%xmm1
  movsd  D4(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  divsd  -0x48(%rbp),%xmm0
  movsd  %xmm0,-0xc0(%rbp)
  movsd  -0x98(%rbp),%xmm0
  movq   D12(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  mulsd  0x18(%rbp),%xmm0
  mulsd  -0x28(%rbp),%xmm0
  movapd %xmm0,%xmm7
  divsd  -0x48(%rbp),%xmm7
  movq   %xmm7,%rax
  movq   %rax,%xmm0
  call   <exp@plt>
  mulsd  -0xc0(%rbp),%xmm0
  mulsd  -0x50(%rbp),%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D12
type_guessed: f32[2]
name: extract_symbolic_data
arguments: data_label: D4
type_guessed: f64

tool: {"D12": [0.0,-0.0]}

tool: D4: 3.141592653589793

assistant: ```c
double nuclear_attraction(double x1, double y1, double z1, double norm1, int l1, int m1, int n1, double alpha1, double x2, double y2, double z2, double norm2, int l2, int m2, int n2, double alpha2, double x3, double y3, double z3) {
  int I, J, K;
  double gamma, xp, yp, zp, sum, rab2, rcp2;
  double *Ax, *Ay, *Az;
  gamma = alpha1 + alpha2;
  xp = product_center_1D(alpha1, x1, alpha2, x2);
  yp = product_center_1D(alpha1, y1, alpha2, y2);
  zp = product_center_1D(alpha1, z1, alpha2, z2);
  rab2 = dist2(x1, y1, z1, x2, y2, z2);
  rcp2 = dist2(x3, y3, z3, xp, yp, zp);
  Ax = A_array(l1, l2, xp - x1, xp - x2, xp - x3, gamma);
  Ay = A_array(m1, m2, yp - y1, yp - y2, yp - y3, gamma);
  Az = A_array(n1, n2, zp - z1, zp - z2, zp - z3, gamma);
  sum = 0.;
  for (I = 0; I < l1 + l2 + 1; I++)
    for (J = 0; J < m1 + m2 + 1; J++)
      for (K = 0; K < n1 + n2 + 1; K++)
        sum += Ax[I] * Ay[J] * Az[K] * Fgamma(I + J + K, rcp2 * gamma);
  free(Ax);
  free(Ay);
  free(Az);
  return -norm1 * norm2 * 2 * 3.14159265358979323846 / gamma * exp(-alpha1 * alpha2 * rab2 / gamma) * sum;
}
```