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

```asm
<fornberg_weights>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %r12
  push   %rbx
  sub    $0x40,%rsp
  mov    %edi,-0x34(%rbp)
  mov    %esi,-0x38(%rbp)
  mov    %rdx,-0x40(%rbp)
  mov    %rcx,-0x48(%rbp)
  mov    -0x38(%rbp),%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x48(%rbp),%rax
  movss  D13(%rip),%xmm0
  movss  %xmm0,(%rax)
  movss  D13(%rip),%xmm0
  movss  %xmm0,-0x30(%rbp)
  mov    -0x48(%rbp),%rdx
  mov    -0x18(%rbp),%eax
  mov    %rdx,%r8
  mov    $0x0,%ecx
  mov    $0x0,%edx
  mov    $0x0,%esi
  mov    %eax,%edi
  call   <get_weight@plt>
  mov    %eax,%r8d
  mov    $0x0,%ecx
  mov    $0x0,%edx
  mov    $0x0,%esi
  lea    D24(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  movl   $0x1,-0x24(%rbp)
  jmp    L104
L108:
  movss  D13(%rip),%xmm0
  movss  %xmm0,-0x2c(%rbp)
  movl   $0x0,-0x20(%rbp)
  jmp    L61
L95:
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    -0x20(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,4),%rcx
  mov    -0x40(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rdx),%edx
  sub    %edx,%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  movss  %xmm0,-0x14(%rbp)
  movss  -0x2c(%rbp),%xmm0
  mulss  -0x14(%rbp),%xmm0
  movss  %xmm0,-0x2c(%rbp)
  mov    -0x24(%rbp),%eax
  cmp    -0x34(%rbp),%eax
  jg     L24
  mov    -0x18(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    -0x18(%rbp),%eax
  add    $0x1,%eax
  imul   %edx,%eax
  imul   -0x24(%rbp),%eax
  mov    %eax,%ecx
  mov    -0x18(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    -0x24(%rbp),%eax
  sub    $0x1,%eax
  imul   %edx,%eax
  lea    (%rcx,%rax,1),%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  pxor   %xmm0,%xmm0
  movss  %xmm0,(%rax)
L24:
  mov    -0x24(%rbp),%eax
  cmp    -0x34(%rbp),%eax
  jge    L27
  mov    -0x24(%rbp),%eax
  mov    %eax,-0x28(%rbp)
  jmp    L130
L27:
  mov    -0x34(%rbp),%eax
  mov    %eax,-0x28(%rbp)
L130:
  movl   $0x0,-0x1c(%rbp)
  jmp    L62
L121:
  cmpl   $0x0,-0x1c(%rbp)
  jne    L90
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%ebx
  mov    -0x24(%rbp),%eax
  lea    -0x1(%rax),%edi
  mov    -0x48(%rbp),%rcx
  mov    -0x20(%rbp),%edx
  mov    -0x1c(%rbp),%esi
  mov    -0x18(%rbp),%eax
  mov    %rcx,%r8
  mov    %edx,%ecx
  mov    %edi,%edx
  mov    %eax,%edi
  call   <get_weight@plt>
  imul   %ebx,%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  mov    -0x18(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    -0x18(%rbp),%eax
  add    $0x1,%eax
  imul   %edx,%eax
  imul   -0x1c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  add    $0x1,%eax
  imul   -0x24(%rbp),%eax
  add    %eax,%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  divss  -0x14(%rbp),%xmm0
  movss  %xmm0,(%rax)
  jmp    L32
L90:
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%ebx
  mov    -0x24(%rbp),%eax
  lea    -0x1(%rax),%edi
  mov    -0x48(%rbp),%rcx
  mov    -0x20(%rbp),%edx
  mov    -0x1c(%rbp),%esi
  mov    -0x18(%rbp),%eax
  mov    %rcx,%r8
  mov    %edx,%ecx
  mov    %edi,%edx
  mov    %eax,%edi
  call   <get_weight@plt>
  imul   %eax,%ebx
  mov    -0x24(%rbp),%eax
  lea    -0x1(%rax),%edi
  mov    -0x1c(%rbp),%eax
  lea    -0x1(%rax),%esi
  mov    -0x48(%rbp),%rcx
  mov    -0x20(%rbp),%edx
  mov    -0x18(%rbp),%eax
  mov    %rcx,%r8
  mov    %edx,%ecx
  mov    %edi,%edx
  mov    %eax,%edi
  call   <get_weight@plt>
  imul   -0x1c(%rbp),%eax
  sub    %eax,%ebx
  mov    %ebx,%edx
  pxor   %xmm0,%xmm0
  cvtsi2ss %edx,%xmm0
  mov    -0x18(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    -0x18(%rbp),%eax
  add    $0x1,%eax
  imul   %edx,%eax
  imul   -0x1c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  add    $0x1,%eax
  imul   -0x24(%rbp),%eax
  add    %eax,%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  divss  -0x14(%rbp),%xmm0
  movss  %xmm0,(%rax)
L32:
  addl   $0x1,-0x1c(%rbp)
L62:
  mov    -0x1c(%rbp),%eax
  cmp    -0x28(%rbp),%eax
  jle    L121
  addl   $0x1,-0x20(%rbp)
L61:
  mov    -0x24(%rbp),%eax
  cmp    -0x20(%rbp),%eax
  jg     L95
  movl   $0x0,-0x1c(%rbp)
  jmp    L5
L112:
  cmpl   $0x0,-0x1c(%rbp)
  jne    L113
  movss  -0x30(%rbp),%xmm0
  divss  -0x2c(%rbp),%xmm0
  movss  %xmm0,-0x4c(%rbp)
  mov    -0x24(%rbp),%eax
  cltq
  shl    $0x2,%rax
  lea    -0x4(%rax),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  neg    %eax
  mov    %eax,%ebx
  mov    -0x24(%rbp),%eax
  lea    -0x1(%rax),%ecx
  mov    -0x24(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    -0x48(%rbp),%rdi
  mov    -0x1c(%rbp),%esi
  mov    -0x18(%rbp),%eax
  mov    %rdi,%r8
  mov    %eax,%edi
  call   <get_weight@plt>
  imul   %ebx,%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  mov    -0x18(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    -0x18(%rbp),%eax
  add    $0x1,%eax
  imul   %edx,%eax
  imul   -0x1c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  add    $0x1,%eax
  imul   -0x24(%rbp),%eax
  add    %eax,%edx
  mov    -0x24(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mulss  -0x4c(%rbp),%xmm0
  movss  %xmm0,(%rax)
  jmp    L31
L113:
  movss  -0x30(%rbp),%xmm0
  divss  -0x2c(%rbp),%xmm0
  movss  %xmm0,-0x4c(%rbp)
  mov    -0x24(%rbp),%eax
  lea    -0x1(%rax),%ecx
  mov    -0x24(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    -0x1c(%rbp),%eax
  lea    -0x1(%rax),%esi
  mov    -0x48(%rbp),%rdi
  mov    -0x18(%rbp),%eax
  mov    %rdi,%r8
  mov    %eax,%edi
  call   <get_weight@plt>
  imul   -0x1c(%rbp),%eax
  mov    %eax,%ebx
  mov    -0x24(%rbp),%eax
  cltq
  shl    $0x2,%rax
  lea    -0x4(%rax),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%r12d
  mov    -0x24(%rbp),%eax
  lea    -0x1(%rax),%ecx
  mov    -0x24(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    -0x48(%rbp),%rdi
  mov    -0x1c(%rbp),%esi
  mov    -0x18(%rbp),%eax
  mov    %rdi,%r8
  mov    %eax,%edi
  call   <get_weight@plt>
  imul   %r12d,%eax
  sub    %eax,%ebx
  mov    %ebx,%edx
  pxor   %xmm0,%xmm0
  cvtsi2ss %edx,%xmm0
  mov    -0x18(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    -0x18(%rbp),%eax
  add    $0x1,%eax
  imul   %edx,%eax
  imul   -0x1c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  add    $0x1,%eax
  imul   -0x24(%rbp),%eax
  add    %eax,%edx
  mov    -0x24(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mulss  -0x4c(%rbp),%xmm0
  movss  %xmm0,(%rax)
L31:
  addl   $0x1,-0x1c(%rbp)
L5:
  mov    -0x1c(%rbp),%eax
  cmp    -0x28(%rbp),%eax
  jle    L112
  movss  -0x2c(%rbp),%xmm0
  movss  %xmm0,-0x30(%rbp)
  addl   $0x1,-0x24(%rbp)
L104:
  mov    -0x24(%rbp),%eax
  cmp    -0x18(%rbp),%eax
  jle    L108
  nop
  nop
  add    $0x40,%rsp
  pop    %rbx
  pop    %r12
  pop    %rbp
  ret
```

tool_calls: name: unpack_data
arguments: label: D13
data_type: byte[4]
name: unpack_data
arguments: label: D24
data_type: string

tool: {"D13": [0x00,0x00,0x80,0x3f]}

tool: D24: delta %d %d %d=%f


assistant: ```c
void fornberg_weights(int M, int p, int *alpha, float *delta) {
  int N = p;
  float c1, c2, c3;
  int min;
  int i, j, n, v, m;
  delta[(N + 1) * (N + 1) * 0 + (N + 1) * 0 + 0] = 1;
  c1 = 1;
  printf("delta %d %d %d=%f\n", 0, 0, 0, get_weight(N, 0, 0, 0, delta));
  for (n = 1; n <= N; n++) {
    c2 = 1;
    for (v = 0; v <= n - 1; v++) {
      c3 = alpha[n] - alpha[v];
      c2 = c2 * c3;
      if (n <= M) {
        delta[(N + 1) * (N + 1) * n + (N + 1) * (n - 1) + v] = 0;
      }
      if (n < M)
        min = n;
      else
        min = M;
      for (m = 0; m <= min; m++) {
        if (m == 0)
          delta[(N + 1) * (N + 1) * m + (N + 1) * n + v] = (alpha[n] * get_weight(N, m, n - 1, v, delta)) / c3;
        else
          delta[(N + 1) * (N + 1) * m + (N + 1) * n + v] = (alpha[n] * get_weight(N, m, n - 1, v, delta) - m * get_weight(N, m - 1, n - 1, v, delta)) / c3;
      }
    }
    for (m = 0; m <= min; m++) {
      if (m == 0)
        delta[(N + 1) * (N + 1) * m + (N + 1) * n + n] = (c1 / c2) * (-1 * alpha[n - 1] * get_weight(N, m, n - 1, n - 1, delta));
      else
        delta[(N + 1) * (N + 1) * m + (N + 1) * n + n] = (c1 / c2) * (m * get_weight(N, m - 1, n - 1, n - 1, delta) - alpha[n - 1] * get_weight(N, m, n - 1, n - 1, delta));
    }
    c1 = c2;
  }
}
```