user: 这段汇编代码用C语言表示是什么样的?

```asm
<bspline>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %edi,-0x14(%rbp)
  mov    %esi,-0x18(%rbp)
  mov    %edx,-0x1c(%rbp)
  mov    %rcx,-0x28(%rbp)
  movsd  %xmm0,-0x30(%rbp)
  mov    -0x18(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  cmp    %eax,-0x14(%rbp)
  seta   %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x18(%rbp),%eax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x18(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,%eax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  comisd %xmm1,%xmm0
  setae  %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x28(%rbp),%rax
  movsd  (%rax),%xmm1
  movsd  -0x30(%rbp),%xmm0
  comisd %xmm1,%xmm0
  jb     L37
  mov    -0x14(%rbp),%eax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  comisd -0x30(%rbp),%xmm0
  jb     L37
  mov    $0x1,%eax
  jmp    L60
L37:
  mov    $0x0,%eax
L60:
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  cmpl   $0x0,-0x1c(%rbp)
  jne    L21
  mov    -0x18(%rbp),%eax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  movsd  -0x30(%rbp),%xmm0
  comisd %xmm1,%xmm0
  jb     L0
  mov    -0x18(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,%eax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  comisd -0x30(%rbp),%xmm0
  jbe    L0
  movsd  D0(%rip),%xmm0
  jmp    L52
L0:
  pxor   %xmm0,%xmm0
  jmp    L52
L21:
  mov    -0x18(%rbp),%eax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x18(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  add    $0x1,%eax
  mov    %eax,%eax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  comisd %xmm1,%xmm0
  setae  %al
  movzbl %al,%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  mov    -0x18(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,%eax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mov    -0x18(%rbp),%eax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  movapd %xmm0,%xmm2
  subsd  %xmm1,%xmm2
  mov    -0x18(%rbp),%eax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  movsd  -0x30(%rbp),%xmm0
  subsd  %xmm1,%xmm0
  movq   %xmm0,%rax
  movapd %xmm2,%xmm1
  movq   %rax,%xmm0
  mov    $0x2,%eax
  call   <frac@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  mov    -0x18(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  add    $0x1,%eax
  mov    %eax,%eax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mov    -0x18(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,%eax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  movapd %xmm0,%xmm2
  subsd  %xmm1,%xmm2
  mov    -0x18(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  add    $0x1,%eax
  mov    %eax,%eax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  subsd  -0x30(%rbp),%xmm0
  movq   %xmm0,%rax
  movapd %xmm2,%xmm1
  movq   %rax,%xmm0
  mov    $0x2,%eax
  call   <frac@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  movsd  %xmm0,-0x8(%rbp)
  mov    -0x1c(%rbp),%eax
  lea    -0x1(%rax),%edi
  mov    -0x30(%rbp),%rcx
  mov    -0x28(%rbp),%rdx
  mov    -0x18(%rbp),%esi
  mov    -0x14(%rbp),%eax
  movq   %rcx,%xmm0
  mov    %rdx,%rcx
  mov    %edi,%edx
  mov    %eax,%edi
  call   <bspline>
  movq   %xmm0,%rax
  movq   %rax,%xmm3
  mulsd  -0x10(%rbp),%xmm3
  movsd  %xmm3,-0x38(%rbp)
  mov    -0x1c(%rbp),%eax
  lea    -0x1(%rax),%edi
  mov    -0x18(%rbp),%eax
  lea    0x1(%rax),%esi
  mov    -0x30(%rbp),%rcx
  mov    -0x28(%rbp),%rdx
  mov    -0x14(%rbp),%eax
  movq   %rcx,%xmm0
  mov    %rdx,%rcx
  mov    %edi,%edx
  mov    %eax,%edi
  call   <bspline>
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  mulsd  -0x8(%rbp),%xmm0
  addsd  -0x38(%rbp),%xmm0
L52:
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  leave
  ret
```

tool_calls: name: parse_data
arguments: tag: D0
datatype: f64

tool: D0: 1

assistant: ```c
double bspline(unsigned int n, unsigned int i, unsigned int p, const double tau[n + 1], double u) {
  assert(i + p < n);
  assert(tau[i] <= tau[i + 1]);
  assert((tau[0] <= u) && (u <= tau[n]));
  if (0 == p)
    return ((tau[i] <= u) && (u < tau[i + 1])) ? 1. : 0.;
  assert(tau[i] <= tau[i + p + 1]);
  double a = frac(u - tau[i], tau[i + p] - tau[i]);
  double b = frac(tau[i + p + 1] - u, tau[i + p + 1] - tau[i + 1]);
  return a * bspline(n, i, p - 1, tau, u) + b * bspline(n, i + 1, p - 1, tau, u);
}
```