user: 请将以下的汇编代码转换成C语言代码：

```asm
<single_decay>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  movss  %xmm0,-0x54(%rbp)
  movss  %xmm1,-0x58(%rbp)
  movss  %xmm2,-0x5c(%rbp)
  movss  D56(%rip),%xmm0
  divss  -0x58(%rbp),%xmm0
  movss  %xmm0,-0x38(%rbp)
  movss  -0x38(%rbp),%xmm0
  cvttss2si %xmm0,%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  divss  -0x5c(%rbp),%xmm0
  cvttss2si %xmm0,%eax
  mov    %eax,-0x34(%rbp)
  movss  D56(%rip),%xmm0
  movss  %xmm0,-0x30(%rbp)
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0x40(%rbp)
  movss  -0x54(%rbp),%xmm0
  movss  %xmm0,-0x3c(%rbp)
  mov    -0x34(%rbp),%eax
  cltq
  shl    $0x2,%eax
  mov    %eax,%edi
  call   <malloc@plt>
  mov    %rax,-0x28(%rbp)
  mov    -0x34(%rbp),%eax
  cltq
  shl    $0x2,%eax
  mov    %eax,%edi
  call   <malloc@plt>
  mov    %rax,-0x20(%rbp)
  lea    D27(%rip),%rax
  mov    %rax,%rsi
  lea    D25(%rip),%rax
  mov    %rax,%rdi
  call   <fopen@plt>
  mov    %rax,-0x18(%rbp)
  movss  -0x3c(%rbp),%xmm0
  mov    -0x40(%rbp),%edx
  mov    -0x18(%rbp),%rax
  movaps %xmm0,%xmm1
  movd   %edx,%xmm0
  lea    D34(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x28(%rbp),%rax
  movss  -0x3c(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  movss  -0x40(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x34(%rbp),%eax
  cltq
  shl    $0x2,%eax
  mov    %eax,%edi
  call   <malloc@plt>
  mov    %rax,-0x10(%rbp)
  mov    -0x34(%rbp),%eax
  cltq
  shl    $0x2,%eax
  mov    %eax,%edi
  call   <malloc@plt>
  mov    %rax,-0x8(%rbp)
  movl   $0x0,-0x48(%rbp)
  jmp    L49
L0:
  mov    -0x10(%rbp),%rax
  movss  -0x54(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x8(%rbp),%rax
  pxor   %xmm0,%xmm0
  movss  %xmm0,(%rax)
  movss  -0x54(%rbp),%xmm0
  movss  %xmm0,-0x3c(%rbp)
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0x40(%rbp)
  movl   $0x1,-0x4c(%rbp)
  jmp    L53
L32:
  movss  -0x40(%rbp),%xmm0
  addss  -0x5c(%rbp),%xmm0
  movss  %xmm0,-0x40(%rbp)
  movss  -0x5c(%rbp),%xmm1
  movss  -0x58(%rbp),%xmm0
  mov    -0x3c(%rbp),%eax
  movaps %xmm1,%xmm2
  movaps %xmm0,%xmm1
  movd   %eax,%xmm0
  call   <delta_n_step@plt>
  movd   %xmm0,%eax
  mov    %eax,-0x2c(%rbp)
  movss  -0x3c(%rbp),%xmm0
  addss  -0x2c(%rbp),%xmm0
  movss  %xmm0,-0x3c(%rbp)
  mov    -0x4c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  movss  -0x3c(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x4c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movss  -0x40(%rbp),%xmm0
  movss  %xmm0,(%rax)
  addl   $0x1,-0x4c(%rbp)
L53:
  mov    -0x4c(%rbp),%eax
  cmp    -0x34(%rbp),%eax
  jl     L32
  movl   $0x1,-0x4c(%rbp)
  jmp    L37
L30:
  mov    -0x4c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm1
  mov    -0x4c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  mov    -0x4c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x4c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm1
  mov    -0x4c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  mov    -0x4c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  addl   $0x1,-0x4c(%rbp)
L37:
  mov    -0x4c(%rbp),%eax
  cmp    -0x34(%rbp),%eax
  jl     L30
  addl   $0x1,-0x48(%rbp)
L49:
  pxor   %xmm1,%xmm1
  cvtsi2ssl -0x48(%rbp),%xmm1
  movss  -0x30(%rbp),%xmm0
  comiss %xmm1,%xmm0
  ja     L0
  movl   $0x1,-0x44(%rbp)
  jmp    L43
L23:
  mov    -0x44(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  mov    -0x44(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  divss  -0x30(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x44(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  mov    -0x44(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  divss  -0x30(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x44(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  mov    -0x44(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x18(%rbp),%rax
  movaps %xmm0,%xmm1
  movd   %edx,%xmm0
  lea    D34(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  addl   $0x1,-0x44(%rbp)
L43:
  mov    -0x44(%rbp),%eax
  cmp    -0x34(%rbp),%eax
  jl     L23
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <fclose@plt>
  nop
  leave
  ret
```

tool_calls: name: read_data
arguments: data_tag: D56
type_guessed: f32
name: read_data
arguments: data_tag: D27
type_guessed: string
name: read_data
arguments: data_tag: D25
type_guessed: string
name: read_data
arguments: data_tag: D34
type_guessed: string

tool: D56: 5

tool: D27: w+

tool: D25: data_rand_average.txt

tool: D34: %f %f


assistant: ```c
void single_decay(float N0, float lambda, float dt) {
  float t_total = 5.0 / lambda;
  int n_points = (int)t_total / dt;
  int i;
  int j;
  int k;
  float M = 5.0;
  float t = 0.0;
  float n = N0;
  float *array_n = malloc(n_points * sizeof(float));
  float *array_t = malloc(n_points * sizeof(float));
  FILE *out = fopen("data_rand_average.txt", "w+");
  fprintf(out, "%f %f\n", t, n);
  array_n[0] = n;
  array_t[0] = t;
  float *array_n_temp = malloc(n_points * sizeof(float));
  float *array_t_temp = malloc(n_points * sizeof(float));
  for (j = 0; j < M; j++) {
    array_n_temp[0] = N0;
    array_t_temp[0] = 0.0;
    n = N0;
    t = 0.0;
    for (i = 1; i < (n_points); i++) {
      t += dt;
      float delta_n = delta_n_step(n, lambda, dt);
      n += delta_n;
      array_n_temp[i] = n;
      array_t_temp[i] = t;
    }
    for (i = 1; i < (n_points); i++) {
      array_n[i] = array_n[i] + array_n_temp[i];
      array_t[i] = array_t[i] + array_t_temp[i];
    }
  }
  for (k = 1; k < (n_points); k++) {
    array_n[k] = array_n[k] / M;
    array_t[k] = array_t[k] / M;
    fprintf(out, "%f %f\n", array_t[k], array_n[k]);
  }
  fclose(out);
}
```