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

```asm
<deNoise>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x88,%rsp
  mov    %rdi,-0x68(%rbp)
  mov    %rsi,-0x70(%rbp)
  mov    %rdx,-0x78(%rbp)
  mov    %rcx,-0x80(%rbp)
  mov    %r8d,-0x84(%rbp)
  mov    %r9d,-0x88(%rbp)
  movq   $0x0,-0x40(%rbp)
  movq   $0x0,-0x38(%rbp)
  mov    -0x80(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,-0x30(%rbp)
  cmpq   $0x0,-0x30(%rbp)
  jne    L62
  mov    -0x84(%rbp),%eax
  imul   -0x88(%rbp),%eax
  cltq
  add    %eax,%eax
  mov    %eax,%edi
  call   <malloc@plt>
  mov    %rax,-0x30(%rbp)
  mov    -0x80(%rbp),%rax
  mov    -0x30(%rbp),%rdx
  mov    %rdx,(%rax)
  movq   $0x0,-0x48(%rbp)
  jmp    L88
L6:
  mov    -0x84(%rbp),%eax
  cltq
  imul   -0x48(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x28(%rbp)
  mov    0x10(%rbp),%eax
  cltq
  imul   -0x48(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x20(%rbp)
  movq   $0x0,-0x50(%rbp)
  jmp    L76
L94:
  mov    -0x50(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x50(%rbp),%rax
  lea    (%rax,%rax,1),%rcx
  mov    -0x28(%rbp),%rax
  add    %rcx,%rax
  shl    $0x8,%edx
  mov    %dx,(%rax)
  addq   $0x1,-0x50(%rbp)
L76:
  mov    -0x84(%rbp),%eax
  cltq
  cmp    %rax,-0x50(%rbp)
  jl     L94
  addq   $0x1,-0x48(%rbp)
L88:
  mov    -0x88(%rbp),%eax
  cltq
  cmp    %rax,-0x48(%rbp)
  jl     L6
L62:
  mov    0x20(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jne    L108
  mov    0x28(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jne    L108
  mov    -0x88(%rbp),%r8d
  mov    -0x84(%rbp),%ecx
  mov    -0x30(%rbp),%rdx
  mov    -0x70(%rbp),%rsi
  mov    -0x68(%rbp),%rax
  push   0x30(%rbp)
  mov    0x18(%rbp),%edi
  push   %rdi
  mov    0x10(%rbp),%r9d
  mov    %rax,%rdi
  call   <deNoiseTemporal@plt>
  add    $0x10,%rsp
  jmp    L107
L108:
  mov    0x30(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jne    L115
  mov    -0x88(%rbp),%r8d
  mov    -0x84(%rbp),%ecx
  mov    -0x78(%rbp),%rdx
  mov    -0x70(%rbp),%rsi
  mov    -0x68(%rbp),%rax
  sub    $0x8,%rsp
  push   0x28(%rbp)
  push   0x20(%rbp)
  mov    0x18(%rbp),%edi
  push   %rdi
  mov    0x10(%rbp),%r9d
  mov    %rax,%rdi
  call   <deNoiseSpacial@plt>
  add    $0x20,%rsp
  jmp    L107
L115:
  mov    -0x68(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x10,%eax
  mov    %eax,-0x60(%rbp)
  mov    -0x78(%rbp),%rax
  mov    -0x60(%rbp),%edx
  mov    %edx,(%rax)
  mov    -0x30(%rbp),%rax
  movzwl (%rax),%eax
  shl    $0x8,%eax
  movzwl %ax,%eax
  mov    0x30(%rbp),%rdx
  mov    -0x60(%rbp),%ecx
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <LowPassMul@plt>
  mov    %eax,-0x58(%rbp)
  mov    -0x58(%rbp),%eax
  add    $0x1000007f,%eax
  shr    $0x8,%eax
  mov    %eax,%edx
  mov    -0x30(%rbp),%rax
  mov    %dx,(%rax)
  mov    -0x58(%rbp),%eax
  add    $0x10007fff,%eax
  shr    $0x10,%eax
  mov    %eax,%edx
  mov    -0x70(%rbp),%rax
  mov    %dl,(%rax)
  movq   $0x1,-0x50(%rbp)
  jmp    L8
L48:
  mov    -0x50(%rbp),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x10,%eax
  mov    %eax,%ecx
  mov    -0x60(%rbp),%eax
  movzwl %ax,%eax
  mov    0x20(%rbp),%rdx
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <LowPassMul@plt>
  mov    %eax,-0x60(%rbp)
  mov    -0x50(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x78(%rbp),%rax
  add    %rax,%rdx
  mov    -0x60(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0x50(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzwl (%rax),%eax
  shl    $0x8,%eax
  movzwl %ax,%eax
  mov    0x30(%rbp),%rdx
  mov    -0x60(%rbp),%ecx
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <LowPassMul@plt>
  mov    %eax,-0x58(%rbp)
  mov    -0x58(%rbp),%eax
  add    $0x1000007f,%eax
  shr    $0x8,%eax
  mov    %eax,%edx
  mov    -0x50(%rbp),%rax
  lea    (%rax,%rax,1),%rcx
  mov    -0x30(%rbp),%rax
  add    %rcx,%rax
  mov    %dx,(%rax)
  mov    -0x58(%rbp),%eax
  add    $0x10007fff,%eax
  shr    $0x10,%eax
  mov    %eax,%ecx
  mov    -0x50(%rbp),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
  addq   $0x1,-0x50(%rbp)
L8:
  mov    -0x84(%rbp),%eax
  cltq
  cmp    %rax,-0x50(%rbp)
  jl     L48
  movq   $0x1,-0x48(%rbp)
  jmp    L135
L2:
  mov    -0x84(%rbp),%eax
  cltq
  imul   -0x48(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x18(%rbp)
  mov    0x10(%rbp),%eax
  cltq
  add    %rax,-0x40(%rbp)
  mov    0x18(%rbp),%eax
  cltq
  add    %rax,-0x38(%rbp)
  mov    -0x40(%rbp),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x10,%eax
  mov    %eax,-0x5c(%rbp)
  mov    -0x78(%rbp),%rax
  mov    (%rax),%eax
  movzwl %ax,%eax
  mov    0x28(%rbp),%rdx
  mov    -0x5c(%rbp),%ecx
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <LowPassMul@plt>
  mov    -0x78(%rbp),%rdx
  mov    %eax,(%rdx)
  mov    -0x78(%rbp),%rax
  mov    (%rax),%ecx
  mov    -0x18(%rbp),%rax
  movzwl (%rax),%eax
  shl    $0x8,%eax
  movzwl %ax,%eax
  mov    0x30(%rbp),%rdx
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <LowPassMul@plt>
  mov    %eax,-0x58(%rbp)
  mov    -0x58(%rbp),%eax
  add    $0x1000007f,%eax
  shr    $0x8,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  mov    %dx,(%rax)
  mov    -0x58(%rbp),%eax
  add    $0x10007fff,%eax
  shr    $0x10,%eax
  mov    %eax,%ecx
  mov    -0x38(%rbp),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
  movq   $0x1,-0x50(%rbp)
  jmp    L17
L93:
  mov    -0x40(%rbp),%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x10,%eax
  mov    %eax,%ecx
  mov    -0x5c(%rbp),%eax
  movzwl %ax,%eax
  mov    0x20(%rbp),%rdx
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <LowPassMul@plt>
  mov    %eax,-0x5c(%rbp)
  mov    -0x50(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x78(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  movzwl %ax,%eax
  mov    -0x50(%rbp),%rdx
  lea    0x0(,%rdx,4),%rcx
  mov    -0x78(%rbp),%rdx
  lea    (%rcx,%rdx,1),%rbx
  mov    0x28(%rbp),%rdx
  mov    -0x5c(%rbp),%ecx
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <LowPassMul@plt>
  mov    %eax,(%rbx)
  mov    -0x50(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x78(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%ecx
  mov    -0x50(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzwl (%rax),%eax
  shl    $0x8,%eax
  movzwl %ax,%eax
  mov    0x30(%rbp),%rdx
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <LowPassMul@plt>
  mov    %eax,-0x54(%rbp)
  mov    -0x54(%rbp),%eax
  add    $0x1000007f,%eax
  shr    $0x8,%eax
  mov    %eax,%edx
  mov    -0x50(%rbp),%rax
  lea    (%rax,%rax,1),%rcx
  mov    -0x18(%rbp),%rax
  add    %rcx,%rax
  mov    %dx,(%rax)
  mov    -0x54(%rbp),%eax
  add    $0x10007fff,%eax
  shr    $0x10,%eax
  mov    %eax,%ecx
  mov    -0x38(%rbp),%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
  addq   $0x1,-0x50(%rbp)
L17:
  mov    -0x84(%rbp),%eax
  cltq
  cmp    %rax,-0x50(%rbp)
  jl     L93
  addq   $0x1,-0x48(%rbp)
L135:
  mov    -0x88(%rbp),%eax
  cltq
  cmp    %rax,-0x48(%rbp)
  jl     L2
L107:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
void deNoise(unsigned char *Frame, unsigned char *FrameDest, unsigned int *LineAnt, unsigned short **FrameAntPtr, int W, int H, int sStride, int dStride, int *Horizontal, int *Vertical, int *Temporal) {
  long X, Y;
  long sLineOffs = 0, dLineOffs = 0;
  unsigned int PixelAnt;
  unsigned int PixelDst;
  unsigned short *FrameAnt = (*FrameAntPtr);
  if (!FrameAnt) {
    (*FrameAntPtr) = FrameAnt = (unsigned short *)malloc(W * H * sizeof(unsigned short));
    for (Y = 0; Y < H; Y++) {
      unsigned short *dst = &FrameAnt[Y * W];
      unsigned char *src = Frame + Y * sStride;
      for (X = 0; X < W; X++)
        dst[X] = src[X] << 8;
    }
  }
  if (!Horizontal[0] && !Vertical[0]) {
    deNoiseTemporal(Frame, FrameDest, FrameAnt, W, H, sStride, dStride, Temporal);
    return;
  }
  if (!Temporal[0]) {
    deNoiseSpacial(Frame, FrameDest, LineAnt, W, H, sStride, dStride, Horizontal, Vertical);
    return;
  }
  LineAnt[0] = PixelAnt = Frame[0] << 16;
  PixelDst = LowPassMul(FrameAnt[0] << 8, PixelAnt, Temporal);
  FrameAnt[0] = ((PixelDst + 0x1000007F) >> 8);
  FrameDest[0] = ((PixelDst + 0x10007FFF) >> 16);
  for (X = 1; X < W; X++) {
    LineAnt[X] = PixelAnt = LowPassMul(PixelAnt, Frame[X] << 16, Horizontal);
    PixelDst = LowPassMul(FrameAnt[X] << 8, PixelAnt, Temporal);
    FrameAnt[X] = ((PixelDst + 0x1000007F) >> 8);
    FrameDest[X] = ((PixelDst + 0x10007FFF) >> 16);
  }
  for (Y = 1; Y < H; Y++) {
    unsigned int PixelAnt;
    unsigned short *LinePrev = &FrameAnt[Y * W];
    sLineOffs += sStride, dLineOffs += dStride;
    PixelAnt = Frame[sLineOffs] << 16;
    LineAnt[0] = LowPassMul(LineAnt[0], PixelAnt, Vertical);
    PixelDst = LowPassMul(LinePrev[0] << 8, LineAnt[0], Temporal);
    LinePrev[0] = ((PixelDst + 0x1000007F) >> 8);
    FrameDest[dLineOffs] = ((PixelDst + 0x10007FFF) >> 16);
    for (X = 1; X < W; X++) {
      unsigned int PixelDst;
      PixelAnt = LowPassMul(PixelAnt, Frame[sLineOffs + X] << 16, Horizontal);
      LineAnt[X] = LowPassMul(LineAnt[X], PixelAnt, Vertical);
      PixelDst = LowPassMul(LinePrev[X] << 8, LineAnt[X], Temporal);
      LinePrev[X] = ((PixelDst + 0x1000007F) >> 8);
      FrameDest[dLineOffs + X] = ((PixelDst + 0x10007FFF) >> 16);
    }
  }
}
```