user: 下面的汇编指令对应的C源代码是什么:

```asm
<dedisperse_lagged>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %edx,-0x44(%rbp)
  mov    %ecx,-0x48(%rbp)
  cmpl   $0x1,-0x44(%rbp)
  setg   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  cmpl   $0x0,-0x48(%rbp)
  setg   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x38(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rdx
  mov    -0x38(%rbp),%rax
  mov    (%rax),%rcx
  mov    %rdx,%rax
  sub    %rcx,%rax
  sar    $0x2,%rax
  mov    %rax,%rcx
  mov    -0x44(%rbp),%edx
  mov    -0x48(%rbp),%eax
  add    %edx,%eax
  sub    $0x1,%eax
  cltq
  cmp    %rax,%rcx
  setge  %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x40(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rdx
  mov    -0x40(%rbp),%rax
  mov    (%rax),%rcx
  mov    %rdx,%rax
  sub    %rcx,%rax
  sar    $0x2,%rax
  mov    %rax,%rcx
  mov    -0x44(%rbp),%edx
  mov    -0x48(%rbp),%eax
  add    %edx,%eax
  sub    $0x1,%eax
  cltq
  cmp    %rax,%rcx
  setge  %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x44(%rbp),%eax
  mov    %eax,%edi
  call   <get_npass@plt>
  mov    %eax,-0x1c(%rbp)
  mov    -0x1c(%rbp),%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  cmp    %eax,-0x44(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x44(%rbp),%eax
  mov    %eax,-0x2c(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x40(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  movl   $0x0,-0x28(%rbp)
  jmp    L37
L11:
  movl   $0x0,-0x24(%rbp)
  jmp    L4
L59:
  mov    -0x24(%rbp),%eax
  cltd
  idivl  -0x2c(%rbp)
  mov    %eax,%r8d
  mov    -0x24(%rbp),%eax
  cltd
  idivl  -0x2c(%rbp)
  mov    %eax,%edx
  mov    -0x48(%rbp),%eax
  add    %eax,%edx
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rcx
  mov    -0x10(%rbp),%rax
  lea    (%rcx,%rax,1),%rsi
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rcx
  mov    -0x18(%rbp),%rax
  lea    (%rcx,%rax,1),%rdi
  mov    -0x2c(%rbp),%eax
  mov    %edx,%ecx
  mov    %eax,%edx
  call   <dedisperse_kernel_lagged@plt>
  mov    -0x2c(%rbp),%eax
  add    %eax,-0x24(%rbp)
L4:
  mov    -0x24(%rbp),%eax
  cmp    -0x44(%rbp),%eax
  jl     L59
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x8(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x2c(%rbp),%eax
  mov    %eax,%edx
  shr    $0x1f,%edx
  add    %edx,%eax
  sar    %eax
  mov    %eax,-0x2c(%rbp)
  addl   $0x1,-0x28(%rbp)
L37:
  mov    -0x28(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  jl     L11
  movl   $0x0,-0x20(%rbp)
  jmp    L7
L39:
  mov    -0x48(%rbp),%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  cltq
  shl    $0x2,%eax
  mov    %eax,%edx
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rcx
  mov    -0x18(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%rcx
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rsi
  mov    -0x10(%rbp),%rax
  add    %rsi,%rax
  mov    (%rax),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  addl   $0x1,-0x20(%rbp)
L7:
  mov    -0x20(%rbp),%eax
  cmp    -0x44(%rbp),%eax
  jl     L39
  nop
  nop
  leave
  ret
```

assistant: ```c
void dedisperse_lagged(float **inin, float **outout, int nchan, int ndat) {
  assert(nchan >= 2);
  assert(ndat >= 1);
  assert(inin[1] - inin[0] >= nchan + ndat - 1);
  assert(outout[1] - outout[0] >= nchan + ndat - 1);
  int npass = get_npass(nchan);
  assert(nchan == (1 << npass));
  int bs = nchan;
  float **in = inin;
  float **out = outout;
  for (int i = 0; i < npass; i++) {
#pragma omp parallel for
    for (int j = 0; j < nchan; j += bs)
      dedisperse_kernel_lagged(in + j, out + j, bs, ndat + j / bs, j / bs);
    float **tmp = in;
    in = out;
    out = tmp;
    bs /= 2;
  }
  for (int j = 0; j < nchan; j++)
    memcpy(out[j], in[j], (ndat + j) * sizeof(float));
}
```