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

```asm
<su_solar_params2>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x58,%rsp
  movq   %xmm1,%rbp
  movsd  %xmm2,0x8(%rsp)
  mov    %rdi,%r12
  mov    %rsi,%r13
  mov    %rdx,%r14
  mov    %rcx,%rbx
  mov    %fs:0x28,%rax
  mov    %rax,0x48(%rsp)
  xor    %eax,%eax
  lea    0x40(%rsp),%rdx
  lea    0x38(%rsp),%rsi
  lea    0x30(%rsp),%rdi
  movsd  %xmm0,0x10(%rsp)
  call   <solar_coords_and_times@plt>
  movsd  0x38(%rsp),%xmm1
  movsd  0x8(%rsp),%xmm0
  call   <greenwich_to_local_time@plt>
  movsd  %xmm0,0x18(%rsp)
  movsd  0x40(%rsp),%xmm1
  movsd  0x8(%rsp),%xmm0
  call   <greenwich_to_local_time@plt>
  movapd %xmm0,%xmm3
  movsd  0x10(%rsp),%xmm4
  cvttsd2si %xmm4,%eax
  movslq %eax,%r15
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  subsd  %xmm0,%xmm4
  movapd %xmm4,%xmm1
  movsd  D28(%rip),%xmm0
  comisd %xmm4,%xmm0
  jbe    L11
  addsd  %xmm0,%xmm1
L29:
  mulsd  D16(%rip),%xmm1
  movsd  0x8(%rsp),%xmm2
  divsd  D12(%rip),%xmm2
  addsd  %xmm2,%xmm1
  movsd  %xmm1,0x8(%rsp)
  movsd  0x18(%rsp),%xmm0
  subsd  %xmm3,%xmm0
  mov    $0x1,%edi
  call   <fmod@plt>
  movapd %xmm0,%xmm3
  mov    %r14,%rdx
  mov    %r13,%rsi
  mov    %r12,%rdi
  movsd  0x8(%rsp),%xmm2
  movq   %rbp,%xmm1
  movsd  0x30(%rsp),%xmm0
  call   <solar_angles@plt>
  test   %rbx,%rbx
  je     L21
  lea    0x2c(%rsp),%rcx
  lea    0x28(%rsp),%rdx
  lea    0x24(%rsp),%rsi
  mov    %r15,%rdi
  call   <su_jul_to_cal_date@plt>
  mov    $0x1,%edx
  mov    $0x1,%esi
  mov    0x24(%rsp),%edi
  call   <su_cal_to_jul_day@plt>
  subsd  D28(%rip),%xmm0
  movsd  0x10(%rsp),%xmm1
  subsd  %xmm0,%xmm1
  cvttsd2si %xmm1,%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  movsd  0x8(%rsp),%xmm1
  divsd  D16(%rip),%xmm1
  addsd  %xmm1,%xmm0
  call   <su_solar_distance_factor2@plt>
  movsd  %xmm0,(%rbx)
L21:
  mov    0x48(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L20
  add    $0x58,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L11:
  subsd  D28(%rip),%xmm1
  add    $0x1,%r15
  jmp    L29
L20:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: tag: D28
data_type: byte[8]
name: parse_data
arguments: tag: D16
data_type: f64
name: parse_data
arguments: tag: D12
data_type: byte[8]

tool: {"D28": [0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x3f]}

tool: D16: 24

tool: {"D12": [0x65,0x73,0x2d,0x38,0x52,0xc1,0xd0,0x3f]}

assistant: ```c
void su_solar_params2(double jtime, double lat, double lon, double *mu0, double *theta0, double *phi0, double *solar_dist_fac) {
  int year;
  int month;
  int day;
  long jwhole;
  double jfrac;
  double delta;
  double gw_mean_sol_time;
  double gw_appar_sol_time;
  double loc_mean_sol_time;
  double loc_appar_sol_time;
  double local_hour;
  double eot;
  double jday;
  solar_coords_and_times(jtime, &delta, &gw_mean_sol_time, &gw_appar_sol_time);
  loc_mean_sol_time = greenwich_to_local_time(lon, gw_mean_sol_time);
  loc_appar_sol_time = greenwich_to_local_time(lon, gw_appar_sol_time);
  jwhole = (int)jtime;
  jfrac = jtime - jwhole;
  if (jfrac < .5)
    jfrac = jfrac + .5;
  else {
    jfrac = jfrac - .5;
    jwhole = jwhole + 1;
  }
  local_hour = jfrac * 24. + lon / (15. * (3.14159265358979323846264338327 / 180.0));
  eot = fmod(loc_mean_sol_time - loc_appar_sol_time, 1.);
  solar_angles(delta, lat, local_hour, eot, mu0, theta0, phi0);
  if (solar_dist_fac) {
    su_jul_to_cal_date(jwhole, &year, &month, &day);
    jday = (int)(jtime - (su_cal_to_jul_day(year, 1, 1) - .5));
    *solar_dist_fac = su_solar_distance_factor2(jday + local_hour / 24.);
  }
}
```