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

```asm
<exactJ>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0xc8,%rsp
  movsd  %xmm0,0x48(%rsp)
  movsd  %xmm1,0x40(%rsp)
  mov    %rdi,%r12
  mov    %rsi,%rbp
  mov    %rdx,0x50(%rsp)
  mov    %rcx,0x58(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0xb8(%rsp)
  xor    %eax,%eax
  mov    D190(%rip),%rax
  mov    %rax,0x70(%rsp)
  mov    D208(%rip),%rax
  mov    %rax,0x78(%rsp)
  mov    D139(%rip),%rax
  mov    %rax,0x80(%rsp)
  mov    D89(%rip),%rax
  mov    %rax,0x88(%rsp)
  mov    D198(%rip),%rax
  mov    %rax,0x90(%rsp)
  mov    D54(%rip),%rax
  mov    %rax,0x98(%rsp)
  mov    D100(%rip),%rax
  mov    %rax,0xa0(%rsp)
  mov    D24(%rip),%rax
  mov    %rax,0xa8(%rsp)
  mov    D166(%rip),%rax
  mov    %rax,0xb0(%rsp)
  movsd  D156(%rip),%xmm7
  mulsd  %xmm0,%xmm7
  movapd %xmm7,%xmm0
  divsd  D196(%rip),%xmm0
  call   <cos@plt>
  movq   %xmm0,%rbx
  movsd  D156(%rip),%xmm0
  mulsd  0x40(%rsp),%xmm0
  divsd  D196(%rip),%xmm0
  call   <cos@plt>
  movapd %xmm0,%xmm1
  movq   %rbx,%xmm0
  mulsd  D99(%rip),%xmm0
  movsd  D138(%rip),%xmm2
  addsd  %xmm2,%xmm0
  mulsd  D20(%rip),%xmm0
  mulsd  D174(%rip),%xmm1
  addsd  %xmm2,%xmm1
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,(%r12)
  movsd  D144(%rip),%xmm1
  divsd  %xmm0,%xmm1
  movsd  %xmm1,0x0(%rbp)
  mov    $0xfffffffe,%r12d
  pxor   %xmm5,%xmm5
  movsd  %xmm5,0x8(%rsp)
  movsd  %xmm5,0x10(%rsp)
  lea    0x68(%rsp),%r14
  lea    0x60(%rsp),%r13
  jmp    L54
L29:
  add    $0x1,%ebp
L33:
  lea    -0x1(%rbp),%ebx
  mov    %ebx,%eax
  or     %r12d,%eax
  je     L29
  pxor   %xmm3,%xmm3
  cvtsi2sd %ebx,%xmm3
  movsd  %xmm3,0x18(%rsp)
  movapd %xmm3,%xmm0
  mulsd  D156(%rip),%xmm0
  mulsd  0x40(%rsp),%xmm0
  divsd  D196(%rip),%xmm0
  mov    %r13,%rsi
  mov    %r14,%rdi
  call   <sincos@plt>
  mov    %ebx,%eax
  imul   %ebx,%eax
  add    %r15d,%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  movsd  D27(%rip),%xmm0
  divsd  %xmm1,%xmm0
  mov    %ebx,%eax
  neg    %eax
  cmovs  %ebx,%eax
  cltq
  add    0x38(%rsp),%rax
  movsd  D106(%rip),%xmm1
  mulsd  0x70(%rsp,%rax,8),%xmm1
  mulsd  %xmm1,%xmm0
  movsd  0x28(%rsp),%xmm1
  mulsd  0x68(%rsp),%xmm1
  movsd  0x30(%rsp),%xmm2
  mulsd  0x60(%rsp),%xmm2
  addsd  %xmm2,%xmm1
  mulsd  %xmm1,%xmm0
  movsd  0x20(%rsp),%xmm1
  mulsd  %xmm0,%xmm1
  addsd  0x10(%rsp),%xmm1
  movsd  %xmm1,0x10(%rsp)
  mulsd  0x18(%rsp),%xmm0
  addsd  0x8(%rsp),%xmm0
  movsd  %xmm0,0x8(%rsp)
  cmp    $0x2,%ebp
  jle    L29
  add    $0x1,%r12d
  cmp    $0x3,%r12d
  je     L56
L54:
  mov    %r12d,%r15d
  imul   %r12d,%r15d
  pxor   %xmm7,%xmm7
  cvtsi2sd %r12d,%xmm7
  movsd  %xmm7,0x20(%rsp)
  movsd  D156(%rip),%xmm0
  mulsd  %xmm7,%xmm0
  mulsd  0x48(%rsp),%xmm0
  divsd  D196(%rip),%xmm0
  mov    %r13,%rsi
  mov    %r14,%rdi
  call   <sincos@plt>
  movsd  0x60(%rsp),%xmm5
  movsd  %xmm5,0x28(%rsp)
  movsd  0x68(%rsp),%xmm6
  movsd  %xmm6,0x30(%rsp)
  mov    $0xffffffff,%ebp
  mov    %r12d,%eax
  neg    %eax
  cmovs  %r12d,%eax
  cltq
  lea    (%rax,%rax,2),%rax
  mov    %rax,0x38(%rsp)
  jmp    L33
L56:
  mov    0x50(%rsp),%rax
  movsd  0x10(%rsp),%xmm6
  movsd  %xmm6,(%rax)
  mov    0x58(%rsp),%rax
  movsd  0x8(%rsp),%xmm4
  movsd  %xmm4,(%rax)
  mov    0xb8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L1
  mov    $0x0,%eax
  add    $0xc8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L1:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: data_label: D190
datatype: f64
name: unpack_data
arguments: data_label: D208
datatype: f64
name: unpack_data
arguments: data_label: D139
datatype: f64
name: unpack_data
arguments: data_label: D89
datatype: f64
name: unpack_data
arguments: data_label: D198
datatype: f64
name: unpack_data
arguments: data_label: D54
datatype: f64
name: unpack_data
arguments: data_label: D100
datatype: f64
name: unpack_data
arguments: data_label: D24
datatype: f64
name: unpack_data
arguments: data_label: D166
datatype: f64
name: unpack_data
arguments: data_label: D156
datatype: f64
name: unpack_data
arguments: data_label: D196
datatype: f64
name: unpack_data
arguments: data_label: D99
datatype: f64
name: unpack_data
arguments: data_label: D138
datatype: f64
name: unpack_data
arguments: data_label: D20
datatype: f64
name: unpack_data
arguments: data_label: D174
datatype: f64
name: unpack_data
arguments: data_label: D144
datatype: byte[8]
name: unpack_data
arguments: data_label: D27
datatype: byte[8]
name: unpack_data
arguments: data_label: D106
datatype: byte[8]

tool: D190: 1.0854

tool: D208: 0.108

tool: D139: 0.0027

tool: D89: 0.402

tool: D198: 0.04

tool: D54: 0.001

tool: D100: 0.0402

tool: D24: 0.004

tool: D166: 0.0001

tool: D156: 3.14159265358979

tool: D196: 300000

tool: D99: 0.4

tool: D138: 1

tool: D20: 500

tool: D174: 0.1

tool: {"D144": [0x50,0xff,0x89,0x6b,0xc3,0x46,0x9a,0x43]}

tool: {"D27": [0x36,0x84,0x24,0x74,0x4f,0x50,0xd7,0x40]}

tool: {"D106": [0xd5,0xcd,0x83,0x9b,0x65,0x98,0xf2,0x3d]}

assistant: ```c
int exactJ(const double x, const double y, double *H, double *nu, double *u, double *v) {
  const double L = 300.0e3;
  const double H0 = 500.0;
  const double nu0 = 30.0 * 1.0e6 * 31556926.0;
  const double rho_ice = 910.0;
  const double rho_sw = 1028.0;
  const double g = 9.81;
  const double C = rho_ice * g * (1.0 - rho_ice / rho_sw) * H0 / (2.0 * nu0);
  const double my_gamma[3][3] = {{1.0854, 0.108, 0.0027}, {0.402, 0.04, 0.001}, {0.0402, 0.004, 0.0001}};
  const double A = L / (4.0 * 3.14159265358979);
  double uu = 0.0, vv = 0.0, denom, trig, kx, ly, B;
  int k, l;
  *H = H0 * (1.0 + 0.4 * cos(3.14159265358979 * x / L)) * (1.0 + 0.1 * cos(3.14159265358979 * y / L));
  *nu = (nu0 * H0) / *H;
  for (k = -2; k <= 2; k++) {
    for (l = -2; l <= 2; l++) {
      if ((k != 0) || (l != 0)) {
        denom = (double)(k * k + l * l);
        kx = (double)(k)*3.14159265358979 * x / L;
        ly = (double)(l)*3.14159265358979 * y / L;
        trig = cos(kx) * sin(ly) + sin(kx) * cos(ly);
        B = (A / denom) * (C * my_gamma[abs(k)][abs(l)]) * trig;
        uu += B * (double)(k);
        vv += B * (double)(l);
      }
    }
  }
  *u = uu;
  *v = vv;
  return 0;
}
```