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

```asm
<Histogram>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %edi,-0x24(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %edx,-0x28(%rbp)
  mov    %ecx,-0x34(%rbp)
  mov    %r8,-0x40(%rbp)
  mov    -0x28(%rbp),%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  sub    $0x1,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x24(%rbp),%eax
  mov    %eax,-0x10(%rbp)
  jmp    L29
L45:
  mov    -0x10(%rbp),%edx
  mov    -0x40(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <get_nth_block4@plt>
  mov    %eax,-0x14(%rbp)
  mov    -0x14(%rbp),%eax
  and    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  add    $0x1,%edx
  mov    %edx,(%rax)
  addl   $0x1,-0x10(%rbp)
L29:
  mov    -0x10(%rbp),%eax
  and    $0x7,%eax
  test   %eax,%eax
  je     L56
  mov    -0x34(%rbp),%eax
  sub    -0x28(%rbp),%eax
  cmp    %eax,-0x10(%rbp)
  jle    L45
L56:
  mov    -0x10(%rbp),%eax
  lea    0x7(%rax),%edx
  test   %eax,%eax
  cmovs  %edx,%eax
  sar    $0x3,%eax
  movslq %eax,%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x10(%rbp),%edx
  mov    -0x40(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <get_nth_block4@plt>
  mov    %eax,-0x14(%rbp)
  jmp    L53
L61:
  mov    -0x14(%rbp),%eax
  and    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  add    $0x1,%edx
  mov    %edx,(%rax)
  sarl   -0x14(%rbp)
  mov    -0x14(%rbp),%eax
  and    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  add    $0x1,%edx
  mov    %edx,(%rax)
  sarl   -0x14(%rbp)
  mov    -0x14(%rbp),%eax
  and    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  add    $0x1,%edx
  mov    %edx,(%rax)
  sarl   -0x14(%rbp)
  mov    -0x14(%rbp),%eax
  and    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  add    $0x1,%edx
  mov    %edx,(%rax)
  sarl   -0x14(%rbp)
  mov    -0x14(%rbp),%eax
  and    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  add    $0x1,%edx
  mov    %edx,(%rax)
  sarl   -0x14(%rbp)
  mov    -0x14(%rbp),%eax
  and    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  add    $0x1,%edx
  mov    %edx,(%rax)
  sarl   -0x14(%rbp)
  mov    -0x14(%rbp),%eax
  and    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  add    $0x1,%edx
  mov    %edx,(%rax)
  sarl   -0x14(%rbp)
  mov    -0x14(%rbp),%eax
  and    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  add    $0x1,%edx
  mov    %edx,(%rax)
  addq   $0x1,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x14(%rbp)
  addl   $0x8,-0x10(%rbp)
L53:
  mov    -0x34(%rbp),%eax
  sub    -0x28(%rbp),%eax
  sub    $0x7,%eax
  cmp    %eax,-0x10(%rbp)
  jl     L61
  jmp    L31
L23:
  mov    -0x10(%rbp),%edx
  mov    -0x40(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <get_nth_block4@plt>
  mov    %eax,-0x14(%rbp)
  mov    -0x14(%rbp),%eax
  and    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  add    $0x1,%edx
  mov    %edx,(%rax)
  addl   $0x1,-0x10(%rbp)
L31:
  mov    -0x34(%rbp),%eax
  sub    -0x28(%rbp),%eax
  cmp    %eax,-0x10(%rbp)
  jle    L23
  nop
  nop
  leave
  ret
```

assistant: ```c
void Histogram(int bitstart, int *P, int m, int bitend, const unsigned char *array) {
  int help, mask, i;
  const unsigned char *pbyte;
  mask = (1 << m) - 1;
  i = bitstart;
  while (i % 8 != 0 && i < bitend - m + 1) {
    help = get_nth_block4(array, i);
    ++P[help & mask];
    i++;
  }
  pbyte = array + i / 8;
  help = get_nth_block4(array, i);
  for (; i < bitend - m + 1 - 8; i += 8) {
    ++P[help & mask];
    help >>= 1;
    ++P[help & mask];
    help >>= 1;
    ++P[help & mask];
    help >>= 1;
    ++P[help & mask];
    help >>= 1;
    ++P[help & mask];
    help >>= 1;
    ++P[help & mask];
    help >>= 1;
    ++P[help & mask];
    help >>= 1;
    ++P[help & mask];
    help = *(unsigned int *)(++pbyte);
  }
  for (; i < bitend - m + 1; i++) {
    help = get_nth_block4(array, i);
    ++P[help & mask];
  }
}
```