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

```asm
<moontransit>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x68,%rsp
  mov    %esi,0x18(%rsp)
  mov    %edx,0x1c(%rsp)
  movsd  %xmm0,0x20(%rsp)
  movsd  %xmm1,0x28(%rsp)
  movsd  %xmm2,0x30(%rsp)
  mov    %rcx,0x38(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x58(%rsp)
  xor    %eax,%eax
  movl   $0x0,(%rcx)
  mov    $0x1f,%r14d
  mov    D7(%rip),%rbx
  mov    %edi,%ebp
L11:
  movq   %rbx,%xmm0
  mulsd  D10(%rip),%xmm0
  divsd  D8(%rip),%xmm0
  mov    0x1c(%rsp),%edx
  mov    0x18(%rsp),%esi
  mov    %ebp,%edi
  call   <days@plt>
  movapd %xmm0,%xmm1
  movsd  0x20(%rsp),%xmm0
  divsd  D33(%rip),%xmm0
  subsd  %xmm0,%xmm1
  movsd  %xmm1,0x8(%rsp)
  movapd %xmm1,%xmm0
  call   <gst@plt>
  addsd  0x30(%rsp),%xmm0
  movsd  %xmm0,0x10(%rsp)
  lea    0x50(%rsp),%r15
  lea    0x48(%rsp),%r13
  lea    0x40(%rsp),%r12
  mov    %r15,%rdx
  mov    %r13,%rsi
  mov    %r12,%rdi
  movsd  0x8(%rsp),%xmm0
  call   <moonpos@plt>
  mov    %r15,%rdx
  mov    %r13,%rsi
  mov    %r12,%rdi
  movsd  0x8(%rsp),%xmm0
  call   <equatorial@plt>
  mov    %r15,%rdx
  mov    %r13,%rsi
  mov    %r12,%rdi
  movsd  0x28(%rsp),%xmm1
  movsd  0x10(%rsp),%xmm0
  call   <topo@plt>
  movsd  0x10(%rsp),%xmm0
  subsd  0x40(%rsp),%xmm0
  call   <rangerad@plt>
  movapd %xmm0,%xmm1
  movq   %rbx,%xmm0
  subsd  %xmm1,%xmm0
  mov    %rbx,%r12
  call   <rangerad@plt>
  movq   %xmm0,%rbx
  sub    $0x1,%r14d
  je     L18
  movq   %r12,%xmm0
  movq   %rbx,%xmm4
  subsd  %xmm4,%xmm0
  andpd  D54(%rip),%xmm0
  comisd D16(%rip),%xmm0
  ja     L11
L26:
  mov    0x58(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L36
  movq   %rbx,%xmm0
  add    $0x68,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L18:
  mov    0x38(%rsp),%rax
  movl   $0x1,(%rax)
  jmp    L26
L36:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: data_tag: D7
data_type: byte[8]
name: disassemble_data
arguments: data_tag: D10
data_type: f64
name: disassemble_data
arguments: data_tag: D8
data_type: byte[8]
name: disassemble_data
arguments: data_tag: D33
data_type: byte[8]
name: disassemble_data
arguments: data_tag: D54
data_type: qword[2]
name: disassemble_data
arguments: data_tag: D16
data_type: byte[16]

tool: {"D7": [0x1a,0x2d,0x44,0x54,0xfb,0x21,0x09,0x40]}

tool: D10: 57.2957795130823

tool: {"D8": [0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x40]}

tool: {"D33": [0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x40]}

tool: {"D54": [0x7fffffffffffffff,0x0000000000000000]}

tool: {"D16": [0x92,0x81,0x5f,0x69,0x5a,0xe0,0x46,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]}

assistant: ```c
double moontransit(int y, int m, int d, double tz, double glat, double glong, int *notransit) {
  double hm, ht, ht1, lon, lat, rv, dnew, lst;
  int itcount;
  ht1 = 180 * 0.0174532925199433;
  ht = 0;
  itcount = 0;
  *notransit = 0;
  do {
    ht = ht1;
    itcount++;
    dnew = days(y, m, d, ht * 57.2957795130823 / 15) - tz / 24;
    lst = gst(dnew) + glong;
    moonpos(dnew, &lon, &lat, &rv);
    equatorial(dnew, &lon, &lat, &rv);
    topo(lst, glat, &lon, &lat, &rv);
    hm = rangerad(lst - lon);
    ht1 = rangerad(ht - hm);
    if (itcount > 30) {
      *notransit = 1;
      break;
    }
  } while (fabs(ht - ht1) > 0.04 * 0.0174532925199433);
  return (ht1);
}
```