user: Translate the below assembly code into C programming language:

```asm
<ATM_Spectrum>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  mov    %rdi,-0x78(%rbp)
  mov    %rsi,-0x80(%rbp)
  mov    %rdx,-0x88(%rbp)
  mov    %rcx,-0x90(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  subq   $0x8,-0x80(%rbp)
  lea    -0x70(%rbp),%rdx
  mov    -0x88(%rbp),%rcx
  mov    -0x78(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <ATM_Dos@plt>
  subq   $0x8,-0x78(%rbp)
  mov    -0x78(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  mov    -0x78(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x68(%rbp)
  mov    -0x78(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm0
  mov    -0x78(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x60(%rbp)
  mov    -0x78(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm0
  mov    -0x78(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x58(%rbp)
  mov    -0x78(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm0
  mov    -0x78(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x50(%rbp)
  mov    -0x78(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm0
  mov    -0x78(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x48(%rbp)
  mov    -0x78(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm0
  mov    -0x78(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x40(%rbp)
  mov    -0x80(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  mov    -0x80(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x38(%rbp)
  mov    -0x80(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm0
  mov    -0x80(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x30(%rbp)
  mov    -0x80(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm0
  mov    -0x80(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x28(%rbp)
  mov    -0x80(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm0
  mov    -0x80(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x20(%rbp)
  mov    -0x80(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm0
  mov    -0x80(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x18(%rbp)
  mov    -0x80(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm0
  mov    -0x80(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  mov    -0x88(%rbp),%rax
  movsd  (%rax),%xmm1
  mov    -0x78(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm0
  comisd %xmm1,%xmm0
  jbe    L10
  mov    -0x90(%rbp),%rax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,(%rax)
  jmp    L24
L10:
  mov    -0x88(%rbp),%rax
  movsd  (%rax),%xmm0
  mov    -0x78(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm1
  comisd %xmm1,%xmm0
  jbe    L28
  mov    -0x88(%rbp),%rax
  movsd  (%rax),%xmm1
  mov    -0x78(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  comisd %xmm1,%xmm0
  jbe    L28
  mov    -0x80(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm1
  mov    -0x88(%rbp),%rax
  movsd  (%rax),%xmm0
  mov    -0x78(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm3
  movapd %xmm0,%xmm2
  subsd  %xmm3,%xmm2
  movsd  D21(%rip),%xmm0
  mulsd  %xmm0,%xmm2
  movsd  -0x38(%rbp),%xmm0
  movapd %xmm0,%xmm3
  divsd  -0x68(%rbp),%xmm3
  movsd  -0x30(%rbp),%xmm0
  divsd  -0x60(%rbp),%xmm0
  addsd  %xmm0,%xmm3
  movsd  -0x20(%rbp),%xmm0
  divsd  -0x50(%rbp),%xmm0
  addsd  %xmm3,%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  movsd  -0x70(%rbp),%xmm0
  mulsd  %xmm1,%xmm0
  mov    -0x90(%rbp),%rax
  movsd  %xmm0,(%rax)
  jmp    L24
L28:
  mov    -0x88(%rbp),%rax
  movsd  (%rax),%xmm0
  mov    -0x78(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm1
  comisd %xmm1,%xmm0
  jbe    L116
  mov    -0x88(%rbp),%rax
  movsd  (%rax),%xmm1
  mov    -0x78(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm0
  comisd %xmm1,%xmm0
  jbe    L116
  mov    -0x80(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm1
  movsd  -0x68(%rbp),%xmm0
  mulsd  -0x30(%rbp),%xmm0
  divsd  -0x60(%rbp),%xmm0
  movapd %xmm0,%xmm2
  addsd  -0x38(%rbp),%xmm2
  movsd  -0x68(%rbp),%xmm0
  mulsd  -0x20(%rbp),%xmm0
  divsd  -0x50(%rbp),%xmm0
  addsd  %xmm0,%xmm2
  movsd  D21(%rip),%xmm0
  mulsd  %xmm0,%xmm2
  mov    -0x78(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm0
  mov    -0x88(%rbp),%rax
  movsd  (%rax),%xmm3
  subsd  %xmm3,%xmm0
  mulsd  %xmm2,%xmm0
  divsd  -0x58(%rbp),%xmm0
  movapd %xmm1,%xmm2
  addsd  %xmm0,%xmm2
  mov    -0x80(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm0
  mov    -0x80(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  movsd  -0x40(%rbp),%xmm1
  mulsd  -0x20(%rbp),%xmm1
  movapd %xmm1,%xmm3
  divsd  -0x50(%rbp),%xmm3
  movsd  -0x40(%rbp),%xmm1
  mulsd  -0x18(%rbp),%xmm1
  divsd  -0x48(%rbp),%xmm1
  addsd  %xmm3,%xmm1
  movapd %xmm1,%xmm3
  addsd  -0x10(%rbp),%xmm3
  movsd  D21(%rip),%xmm1
  mulsd  %xmm1,%xmm3
  movapd %xmm0,%xmm1
  subsd  %xmm3,%xmm1
  mov    -0x88(%rbp),%rax
  movsd  (%rax),%xmm0
  mov    -0x78(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm3
  subsd  %xmm3,%xmm0
  mulsd  %xmm1,%xmm0
  divsd  -0x58(%rbp),%xmm0
  addsd  %xmm0,%xmm2
  movapd %xmm2,%xmm1
  movsd  -0x70(%rbp),%xmm0
  mulsd  %xmm1,%xmm0
  mov    -0x90(%rbp),%rax
  movsd  %xmm0,(%rax)
  jmp    L24
L116:
  mov    -0x88(%rbp),%rax
  movsd  (%rax),%xmm0
  mov    -0x78(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm1
  comisd %xmm1,%xmm0
  jbe    L9
  mov    -0x88(%rbp),%rax
  movsd  (%rax),%xmm1
  mov    -0x78(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm0
  comisd %xmm1,%xmm0
  jbe    L9
  mov    -0x80(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm1
  mov    -0x88(%rbp),%rax
  movsd  (%rax),%xmm0
  mov    -0x78(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm3
  movapd %xmm0,%xmm2
  subsd  %xmm3,%xmm2
  movsd  D21(%rip),%xmm0
  mulsd  %xmm0,%xmm2
  movsd  -0x20(%rbp),%xmm0
  movapd %xmm0,%xmm3
  divsd  -0x50(%rbp),%xmm3
  movsd  -0x18(%rbp),%xmm0
  divsd  -0x48(%rbp),%xmm0
  addsd  %xmm0,%xmm3
  movsd  -0x10(%rbp),%xmm0
  divsd  -0x40(%rbp),%xmm0
  addsd  %xmm3,%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  movsd  -0x70(%rbp),%xmm0
  mulsd  %xmm1,%xmm0
  mov    -0x90(%rbp),%rax
  movsd  %xmm0,(%rax)
  jmp    L24
L9:
  mov    -0x88(%rbp),%rax
  movsd  (%rax),%xmm0
  mov    -0x78(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm1
  comisd %xmm1,%xmm0
  ja     L74
  jmp    L24
L74:
  mov    -0x90(%rbp),%rax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,(%rax)
  jmp    L24
L24:
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L130
  call   <__stack_chk_fail@plt>
L130:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_label: D21
type: byte[8]

tool: {"D21": [0x55,0x55,0x55,0x55,0x55,0x55,0xd5,0x3f]}

assistant: ```c
void ATM_Spectrum(double *et, double *at, double *e, double *spectrum) {
  double a21, a31, a32, a41;
  double e21, e31, e32, e41, e42, e43;
  double a42, a43;
  double dos;
  --at;
  ATM_Dos(et, e, &dos);
  --et;
  e21 = et[2] - et[1];
  e31 = et[3] - et[1];
  e32 = et[3] - et[2];
  e41 = et[4] - et[1];
  e42 = et[4] - et[2];
  e43 = et[4] - et[3];
  a21 = at[2] - at[1];
  a31 = at[3] - at[1];
  a32 = at[3] - at[2];
  a41 = at[4] - at[1];
  a42 = at[4] - at[2];
  a43 = at[4] - at[3];
  if (*e < et[1]) {
    *spectrum = 0.;
  } else if (*e > et[1] && *e < et[2]) {
    *spectrum = dos * (at[1] + (*e - et[1]) * .33333333333333331 * (a21 / e21 + a31 / e31 + a41 / e41));
  } else if (*e > et[2] && *e < et[3]) {
    *spectrum = dos * (at[1] + (a21 + e21 * a31 / e31 + e21 * a41 / e41) * .33333333333333331 * (et[3] - *e) / e32 + (at[4] - at[1] - (e43 * a41 / e41 + e43 * a42 / e42 + a43) * .33333333333333331) * (*e - et[2]) / e32);
  } else if (*e > et[3] && *e < et[4]) {
    *spectrum = dos * (at[4] + (*e - et[4]) * .33333333333333331 * (a41 / e41 + a42 / e42 + a43 / e43));
  } else if (*e > et[4]) {
    *spectrum = 0.;
  }
}
```