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

```asm
<testnewmoon_solarterm>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xd0,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x7d0,-0xcc(%rbp)
  movl   $0x0,-0xc8(%rbp)
  jmp    L24
L67:
  mov    D63(%rip),%rdx
  mov    -0xcc(%rbp),%eax
  movq   %rdx,%xmm0
  mov    $0x1,%esi
  mov    %eax,%edi
  call   <g2jd@plt>
  movq   %xmm0,%rax
  mov    %rax,-0xb8(%rbp)
  mov    -0xb8(%rbp),%rdx
  lea    -0xb0(%rbp),%rax
  movq   %rdx,%xmm0
  mov    $0xf,%esi
  mov    %rax,%rdi
  call   <findnewmoons@plt>
  addl   $0x1,-0xcc(%rbp)
  movl   $0x0,-0xc4(%rbp)
  jmp    L3
L21:
  mov    -0xc4(%rbp),%eax
  cltq
  mov    -0xb0(%rbp,%rax,8),%rcx
  movsd  D0(%rip),%xmm0
  lea    -0x30(%rbp),%rax
  mov    $0x1,%edx
  movapd %xmm0,%xmm1
  lea    D71(%rip),%rsi
  movq   %rcx,%xmm0
  mov    %rax,%rdi
  call   <jdftime@plt>
  mov    -0xc4(%rbp),%eax
  cltq
  mov    -0xb0(%rbp,%rax,8),%rdx
  lea    -0x30(%rbp),%rax
  movq   %rdx,%xmm0
  mov    %rax,%rsi
  lea    D48(%rip),%rax
  mov    %rax,%rdi
  mov    $0x1,%eax
  call   <printf@plt>
  addl   $0x1,-0xc4(%rbp)
L3:
  cmpl   $0xe,-0xc4(%rbp)
  jle    L21
  addl   $0x1,-0xc8(%rbp)
L24:
  cmpl   $0x31,-0xc8(%rbp)
  jle    L67
  movsd  D6(%rip),%xmm0
  movsd  %xmm0,-0xc0(%rbp)
  jmp    L39
L49:
  mov    -0xc0(%rbp),%rax
  movq   %rax,%xmm0
  mov    $0x7de,%edi
  call   <solarterm@plt>
  movq   %xmm0,%rax
  mov    %rax,-0xb8(%rbp)
  movsd  D0(%rip),%xmm0
  mov    -0xb8(%rbp),%rcx
  lea    -0x30(%rbp),%rax
  mov    $0x1,%edx
  movapd %xmm0,%xmm1
  lea    D71(%rip),%rsi
  movq   %rcx,%xmm0
  mov    %rax,%rdi
  call   <jdftime@plt>
  lea    -0x30(%rbp),%rdx
  mov    -0xc0(%rbp),%rax
  mov    %rdx,%rsi
  movq   %rax,%xmm0
  lea    D45(%rip),%rax
  mov    %rax,%rdi
  mov    $0x1,%eax
  call   <printf@plt>
  movsd  -0xc0(%rbp),%xmm1
  movsd  D60(%rip),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0xc0(%rbp)
L39:
  movsd  D97(%rip),%xmm0
  comisd -0xc0(%rbp),%xmm0
  ja     L49
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L61
  call   <__stack_chk_fail@plt>
L61:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: tag: D63
datatype: f64
name: retrieve_data
arguments: tag: D0
datatype: f64
name: retrieve_data
arguments: tag: D71
datatype: string
name: retrieve_data
arguments: tag: D48
datatype: string
name: retrieve_data
arguments: tag: D6
datatype: byte[8]
name: retrieve_data
arguments: tag: D45
datatype: string
name: retrieve_data
arguments: tag: D60
datatype: byte[8]
name: retrieve_data
arguments: tag: D97
datatype: byte[8]

tool: D63: 1

tool: D0: 8

tool: D71: %y-%m-%d %H:%M:%S

tool: D48: found newmoon: %s %.8f


tool: {"D6": [0x00,0x00,0x00,0x00,0x00,0x80,0x56,0xc0]}

tool: D45: solar term: %3.0f %s


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

tool: {"D97": [0x00,0x00,0x00,0x00,0x00,0xd0,0x71,0x40]}

assistant: ```c
void testnewmoon_solarterm(void) {
  double newmoons[15];
  double jd;
  int year = 2000;
  int n;
  char isodt[30];
  int i;
  for (n = 0; n < 50; n++) {
    jd = g2jd(year, 1, 1.0);
    findnewmoons(newmoons, 15, jd);
    year += 1;
    for (i = 0; i < 15; i++) {
      jdftime(isodt, newmoons[i], "%y-%m-%d %H:%M:%S", 8.0, 1);
      printf("found newmoon: %s %.8f\n", isodt, newmoons[i]);
    }
  }
  double angle;
  for (angle = -90; angle < 285; angle += 15) {
    jd = solarterm(2014, angle);
    jdftime(isodt, jd, "%y-%m-%d %H:%M:%S", 8.0, 1);
    printf("solar term: %3.0f %s\n", angle, isodt);
  }
  return;
}
```