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

```asm
<ZeroAngle>:
  endbr64
  push   %r15
  movq   %xmm0,%r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %edi,%ebx
  mov    $0xe,%edi
  sub    $0x88,%rsp
  xorpd  D40(%rip),%xmm2
  divsd  D84(%rip),%xmm2
  movq   %xmm2,%r13
  movsd  %xmm1,0x68(%rsp)
  movsd  %xmm3,0x8(%rsp)
  movsd  %xmm4,0x50(%rsp)
  call   <DegtoRad@plt>
  movsd  0x8(%rsp),%xmm3
  mulsd  D12(%rip),%xmm3
  mov    D13(%rip),%rax
  movsd  %xmm0,0x58(%rsp)
  movsd  D64(%rip),%xmm5
  pxor   %xmm0,%xmm0
  movsd  %xmm0,0x60(%rsp)
  movq   %rax,%xmm1
  movq   %xmm3,%r14
L100:
  movsd  0x68(%rsp),%xmm7
  movq   %r13,%xmm8
  movapd %xmm7,%xmm3
  mulsd  %xmm0,%xmm3
  mulsd  %xmm1,%xmm7
  mulsd  D57(%rip),%xmm0
  mulsd  D57(%rip),%xmm1
  movapd %xmm7,%xmm2
  pxor   %xmm7,%xmm7
  movsd  %xmm0,0x38(%rsp)
  movsd  %xmm1,0x40(%rsp)
  jmp    L45
  nopl   0x0(%rax)
L144:
  movsd  D12(%rip),%xmm2
  mulsd  %xmm0,%xmm2
  comisd %xmm2,%xmm1
  ja     L80
  movapd %xmm1,%xmm3
  movapd %xmm0,%xmm2
L45:
  movq   %r14,%xmm6
  comisd %xmm7,%xmm6
  jb     L80
  movapd %xmm3,%xmm1
  movapd %xmm2,%xmm0
  movsd  %xmm7,0x30(%rsp)
  mulsd  %xmm3,%xmm1
  movsd  %xmm8,0x28(%rsp)
  mulsd  %xmm2,%xmm0
  movsd  %xmm5,0x48(%rsp)
  movsd  %xmm3,0x20(%rsp)
  movsd  %xmm2,0x18(%rsp)
  addsd  %xmm1,%xmm0
  movapd %xmm5,%xmm1
  call   <pow@plt>
  movsd  D13(%rip),%xmm4
  mov    %ebx,%edi
  movapd %xmm0,%xmm1
  movsd  %xmm0,0x8(%rsp)
  divsd  %xmm0,%xmm4
  movq   %r15,%xmm0
  movsd  %xmm4,0x10(%rsp)
  call   <retard@plt>
  xorpd  D40(%rip),%xmm0
  movsd  0x20(%rsp),%xmm3
  movsd  0x18(%rsp),%xmm2
  movsd  0x8(%rsp),%xmm6
  movapd %xmm0,%xmm1
  movsd  0x10(%rsp),%xmm4
  mov    D64(%rip),%rax
  mulsd  %xmm3,%xmm1
  movsd  0x30(%rsp),%xmm7
  movsd  0x28(%rsp),%xmm8
  mulsd  %xmm2,%xmm0
  movq   %rax,%xmm5
  divsd  %xmm6,%xmm1
  divsd  %xmm6,%xmm0
  mulsd  %xmm4,%xmm1
  addsd  %xmm3,%xmm1
  mulsd  %xmm4,%xmm0
  movapd %xmm0,%xmm6
  movapd %xmm1,%xmm0
  movsd  0x40(%rsp),%xmm1
  addsd  %xmm2,%xmm6
  mulsd  %xmm4,%xmm1
  addsd  %xmm0,%xmm1
  movsd  0x38(%rsp),%xmm0
  mulsd  %xmm4,%xmm0
  addsd  %xmm1,%xmm3
  mulsd  %xmm4,%xmm3
  addsd  %xmm6,%xmm0
  addsd  %xmm0,%xmm2
  mulsd  %xmm5,%xmm3
  mulsd  %xmm4,%xmm2
  pxor   %xmm4,%xmm4
  comisd %xmm1,%xmm4
  addsd  %xmm3,%xmm8
  mulsd  %xmm5,%xmm2
  addsd  %xmm2,%xmm7
  jbe    L144
  movsd  0x50(%rsp),%xmm4
  comisd %xmm8,%xmm4
  jbe    L144
  comisd 0x50(%rsp),%xmm8
  jbe    L105
  movsd  0x58(%rsp),%xmm7
  pxor   %xmm6,%xmm6
  comisd %xmm6,%xmm7
  jbe    L105
  nopl   0x0(%rax,%rax,1)
L49:
  movsd  0x58(%rsp),%xmm0
  xorpd  D40(%rip),%xmm0
  mulsd  0x48(%rsp),%xmm0
  movsd  %xmm0,0x58(%rsp)
L132:
  movsd  0x50(%rsp),%xmm7
  comisd %xmm8,%xmm7
  ja     L105
L128:
  movsd  0x58(%rsp),%xmm0
  call   <fabs@plt>
  mov    %rax,%rbp
  mov    D88(%rip),%rax
  movq   %rax,%xmm0
  call   <MOAtoRad@plt>
  mov    $0x2d,%edi
  mov    %rax,%r12
  call   <DegtoRad@plt>
  movsd  0x60(%rsp),%xmm7
  comisd %xmm0,%xmm7
  jbe    L61
  addsd  0x58(%rsp),%xmm7
  movsd  %xmm7,0x60(%rsp)
  movapd %xmm7,%xmm0
L96:
  add    $0x88,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1110 <RadtoDeg@plt>
  nopl   0x0(%rax)
L105:
  movsd  0x58(%rsp),%xmm7
  pxor   %xmm6,%xmm6
  comisd %xmm7,%xmm6
  jbe    L128
  movapd %xmm7,%xmm0
  xorpd  D40(%rip),%xmm0
  mulsd  %xmm5,%xmm0
  movsd  %xmm0,0x58(%rsp)
  jmp    L128
  nopl   0x0(%rax,%rax,1)
L80:
  comisd 0x50(%rsp),%xmm8
  jbe    L132
  movsd  0x58(%rsp),%xmm7
  pxor   %xmm6,%xmm6
  movsd  %xmm5,0x48(%rsp)
  comisd %xmm6,%xmm7
  ja     L49
  jmp    L132
  nopl   0x0(%rax)
L61:
  movsd  0x58(%rsp),%xmm0
  addsd  %xmm7,%xmm0
  movsd  %xmm0,0x60(%rsp)
  cmp    %r12,%rbp
  jl     L96
  lea    0x78(%rsp),%rdi
  lea    0x70(%rsp),%rsi
  call   <sincos@plt>
  mov    D64(%rip),%rax
  movsd  0x70(%rsp),%xmm1
  movsd  0x78(%rsp),%xmm0
  movq   %rax,%xmm5
  jmp    L100
```

tool_calls: name: unpack_data
arguments: label: D40
data_type: f32[4]
name: unpack_data
arguments: label: D84
data_type: f64
name: unpack_data
arguments: label: D12
data_type: f32[2]
name: unpack_data
arguments: label: D13
data_type: f64
name: unpack_data
arguments: label: D64
data_type: f64
name: unpack_data
arguments: label: D57
data_type: byte[8]
name: unpack_data
arguments: label: D88
data_type: f64

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

tool: D84: 12

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

tool: D13: 1

tool: D64: 0.5

tool: {"D57": [0x46,0xb6,0xf3,0xfd,0xd4,0x18,0x40,0xc0]}

tool: D88: 0.01

assistant: ```c
double ZeroAngle(int DragFunction, double DragCoefficient, double Vi, double SightHeight, double ZeroRange, double yIntercept) {
  double t = 0;
  double dt = 1 / Vi;
  double y = -SightHeight / 12;
  double x = 0;
  double da;
  double v = 0, vx = 0, vy = 0;
  double vx1 = 0, vy1 = 0;
  double dv = 0, dvx = 0, dvy = 0;
  double Gx = 0, Gy = 0;
  double angle = 0;
  int quit = 0;
  da = DegtoRad(14);
  for (angle = 0; quit == 0; angle = angle + da) {
    vy = Vi * sin(angle);
    vx = Vi * cos(angle);
    Gx = (-32.194) * sin(angle);
    Gy = (-32.194) * cos(angle);
    for (t = 0, x = 0, y = -SightHeight / 12; x <= ZeroRange * 3; t = t + dt) {
      vy1 = vy;
      vx1 = vx;
      v = pow((pow(vx, 2) + pow(vy, 2)), 0.5);
      dt = 1 / v;
      dv = retard(DragFunction, DragCoefficient, v);
      dvy = -dv * vy / v * dt;
      dvx = -dv * vx / v * dt;
      vx = vx + dvx;
      vy = vy + dvy;
      vy = vy + dt * Gy;
      vx = vx + dt * Gx;
      x = x + dt * (vx + vx1) / 2;
      y = y + dt * (vy + vy1) / 2;
      if (vy < 0 && y < yIntercept) {
        break;
      }
      if (vy > 3 * vx) {
        break;
      }
    }
    if (y > yIntercept && da > 0) {
      da = -da / 2;
    }
    if (y < yIntercept && da < 0) {
      da = -da / 2;
    }
    if (fabs(da) < MOAtoRad(0.01))
      quit = 1;
    if (angle > DegtoRad(45))
      quit = 1;
  }
  return RadtoDeg(angle);
}
```