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

```asm
<geoMag>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x120,%rsp
  movsd  %xmm0,-0x78(%rbp)
  movsd  %xmm1,-0x80(%rbp)
  movsd  %xmm2,-0x88(%rbp)
  movsd  %xmm3,-0x90(%rbp)
  mov    %rdi,-0x98(%rbp)
  mov    %rsi,-0xa0(%rbp)
  mov    %rdx,-0xa8(%rbp)
  mov    %rcx,-0xb0(%rbp)
  mov    %r8,-0xb8(%rbp)
  mov    %r9,-0xc0(%rbp)
  mov    0x10(%rbp),%rax
  mov    %rax,-0xc8(%rbp)
  mov    0x18(%rbp),%rax
  mov    %rax,-0xd0(%rbp)
  mov    0x20(%rbp),%rax
  mov    %rax,-0xd8(%rbp)
  mov    0x28(%rbp),%rax
  mov    %rax,-0xe0(%rbp)
  mov    0x30(%rbp),%rax
  mov    %rax,-0xe8(%rbp)
  mov    0x38(%rbp),%rax
  mov    %rax,-0xf0(%rbp)
  mov    0x40(%rbp),%rax
  mov    %rax,-0xf8(%rbp)
  mov    0x48(%rbp),%rax
  mov    %rax,-0x100(%rbp)
  mov    0x50(%rbp),%rax
  mov    %rax,-0x108(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    $0x0,%eax
  call   <geoMagInit@plt>
  mov    -0xb0(%rbp),%rcx
  mov    -0xa8(%rbp),%rdx
  mov    -0xa0(%rbp),%rsi
  mov    -0x98(%rbp),%rdi
  movsd  -0x90(%rbp),%xmm2
  movsd  -0x88(%rbp),%xmm1
  movsd  -0x80(%rbp),%xmm0
  mov    -0x78(%rbp),%rax
  movapd %xmm2,%xmm3
  movapd %xmm1,%xmm2
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <geomg1@plt>
  movsd  -0x90(%rbp),%xmm1
  movsd  D40(%rip),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x50(%rbp)
  mov    -0xb0(%rbp),%rcx
  lea    -0x58(%rbp),%rdx
  lea    -0x60(%rbp),%rsi
  lea    -0x68(%rbp),%rdi
  movsd  -0x50(%rbp),%xmm2
  movsd  -0x88(%rbp),%xmm1
  movsd  -0x80(%rbp),%xmm0
  mov    -0x78(%rbp),%rax
  movapd %xmm2,%xmm3
  movapd %xmm1,%xmm2
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <geomg1@plt>
  mov    -0x98(%rbp),%rax
  movsd  (%rax),%xmm1
  movsd  D14(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x48(%rbp)
  mov    -0xa0(%rbp),%rax
  movsd  (%rax),%xmm1
  movsd  D14(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x40(%rbp)
  movsd  -0x68(%rbp),%xmm1
  movsd  D14(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x38(%rbp)
  movsd  -0x60(%rbp),%xmm1
  movsd  D14(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x30(%rbp)
  mov    -0xa8(%rbp),%rax
  movsd  (%rax),%xmm4
  movsd  %xmm4,-0x110(%rbp)
  mov    -0x48(%rbp),%rax
  movq   %rax,%xmm0
  call   <cos@plt>
  movsd  %xmm0,-0x118(%rbp)
  mov    -0x40(%rbp),%rax
  movq   %rax,%xmm0
  call   <cos@plt>
  mulsd  -0x118(%rbp),%xmm0
  mulsd  -0x110(%rbp),%xmm0
  mov    -0xd0(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    -0xa8(%rbp),%rax
  movsd  (%rax),%xmm6
  movsd  %xmm6,-0x110(%rbp)
  mov    -0x40(%rbp),%rax
  movq   %rax,%xmm0
  call   <cos@plt>
  movsd  %xmm0,-0x118(%rbp)
  mov    -0x48(%rbp),%rax
  movq   %rax,%xmm0
  call   <sin@plt>
  mulsd  -0x118(%rbp),%xmm0
  mulsd  -0x110(%rbp),%xmm0
  mov    -0xd8(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    -0xa8(%rbp),%rax
  movsd  (%rax),%xmm5
  movsd  %xmm5,-0x110(%rbp)
  mov    -0x40(%rbp),%rax
  movq   %rax,%xmm0
  call   <sin@plt>
  mulsd  -0x110(%rbp),%xmm0
  mov    -0xe0(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    -0xa8(%rbp),%rax
  movsd  (%rax),%xmm7
  movsd  %xmm7,-0x110(%rbp)
  mov    -0x40(%rbp),%rax
  movq   %rax,%xmm0
  call   <cos@plt>
  mulsd  -0x110(%rbp),%xmm0
  mov    -0xe8(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    -0x38(%rbp),%rax
  movq   %rax,%xmm0
  call   <cos@plt>
  movsd  %xmm0,-0x110(%rbp)
  mov    -0x30(%rbp),%rax
  movq   %rax,%xmm0
  call   <cos@plt>
  movsd  -0x110(%rbp),%xmm1
  mulsd  %xmm0,%xmm1
  movsd  -0x58(%rbp),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x28(%rbp)
  mov    -0x30(%rbp),%rax
  movq   %rax,%xmm0
  call   <cos@plt>
  movsd  %xmm0,-0x110(%rbp)
  mov    -0x38(%rbp),%rax
  movq   %rax,%xmm0
  call   <sin@plt>
  movsd  -0x110(%rbp),%xmm1
  mulsd  %xmm0,%xmm1
  movsd  -0x58(%rbp),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x20(%rbp)
  mov    -0x30(%rbp),%rax
  movq   %rax,%xmm0
  call   <sin@plt>
  movsd  -0x58(%rbp),%xmm1
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x18(%rbp)
  mov    -0x30(%rbp),%rax
  movq   %rax,%xmm0
  call   <cos@plt>
  movsd  -0x58(%rbp),%xmm1
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  -0x58(%rbp),%xmm0
  mov    -0xa8(%rbp),%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  mov    -0xc8(%rbp),%rax
  movsd  %xmm0,(%rax)
  movsd  -0x60(%rbp),%xmm0
  mov    -0xa0(%rbp),%rax
  movsd  (%rax),%xmm2
  movapd %xmm0,%xmm1
  subsd  %xmm2,%xmm1
  movsd  D64(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  mov    -0xc0(%rbp),%rax
  movsd  %xmm0,(%rax)
  movsd  -0x68(%rbp),%xmm0
  mov    -0x98(%rbp),%rax
  movsd  (%rax),%xmm2
  movapd %xmm0,%xmm1
  subsd  %xmm2,%xmm1
  movsd  D64(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  mov    -0xb8(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    -0xd0(%rbp),%rax
  movsd  (%rax),%xmm1
  movsd  -0x28(%rbp),%xmm0
  subsd  %xmm1,%xmm0
  mov    -0xf0(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    -0xd8(%rbp),%rax
  movsd  (%rax),%xmm1
  movsd  -0x20(%rbp),%xmm0
  subsd  %xmm1,%xmm0
  mov    -0xf8(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    -0xe0(%rbp),%rax
  movsd  (%rax),%xmm1
  movsd  -0x18(%rbp),%xmm0
  subsd  %xmm1,%xmm0
  mov    -0x100(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    -0xe8(%rbp),%rax
  movsd  (%rax),%xmm1
  movsd  -0x10(%rbp),%xmm0
  subsd  %xmm1,%xmm0
  mov    -0x108(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    $0x0,%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L4
  call   <__stack_chk_fail@plt>
L4:
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_label: D40
datatype: f64
name: parse_data
arguments: data_label: D14
datatype: byte[8]
name: parse_data
arguments: data_label: D64
datatype: f64

tool: D40: 1

tool: {"D14": [0x39,0x9d,0x52,0xa2,0x46,0xdf,0x91,0x3f]}

tool: D64: 60

assistant: ```c
int geoMag(double alt, double glat, double glon, double time, double *dec, double *dip, double *ti, double *gv, double *adec, double *adip, double *ati, double *x, double *y, double *z, double *h, double *ax, double *ay, double *az, double *ah) {
  double time1;
  double dec2, dip2, ti2, rdec, rdip, rdec2, rdip2;
  double x2, y2, z2, h2;
  geoMagInit();
  geomg1(alt, glat, glon, time, dec, dip, ti, gv);
  time1 = time + 1.0;
  geomg1(alt, glat, glon, time1, &dec2, &dip2, &ti2, gv);
  rdec = *dec * (3.14159265358979323846 / 180.0);
  rdip = *dip * (3.14159265358979323846 / 180.0);
  rdec2 = dec2 * (3.14159265358979323846 / 180.0);
  rdip2 = dip2 * (3.14159265358979323846 / 180.0);
  *x = *ti * (cos(rdec) * cos(rdip));
  *y = *ti * (cos(rdip) * sin(rdec));
  *z = *ti * (sin(rdip));
  *h = *ti * (cos(rdip));
  x2 = ti2 * (cos(rdec2) * cos(rdip2));
  y2 = ti2 * (cos(rdip2) * sin(rdec2));
  z2 = ti2 * (sin(rdip2));
  h2 = ti2 * (cos(rdip2));
  *ati = ti2 - *ti;
  *adip = (dip2 - *dip) * (60.0);
  *adec = (dec2 - *dec) * (60.0);
  *ax = x2 - *x;
  *ay = y2 - *y;
  *az = z2 - *z;
  *ah = h2 - *h;
  return (0);
}
```