user: 请将以下的汇编代码转换成C语言代码:

```asm
<print_hist>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xc80,%rsp
  mov    %rdi,-0xc78(%rbp)
  mov    %esi,-0xc7c(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0xc70(%rbp)
  jmp    L70
L106:
  lea    -0xc60(%rbp),%rcx
  mov    -0xc70(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  add    %rax,%rax
  add    %rcx,%rax
  mov    $0x1a,%edx
  mov    $0x20,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  addl   $0x1,-0xc70(%rbp)
L70:
  cmpl   $0x78,-0xc70(%rbp)
  jle    L106
  movl   $0x0,-0xc70(%rbp)
  jmp    L125
L117:
  mov    -0xc70(%rbp),%eax
  cltq
  movb   $0x2b,-0xc60(%rbp,%rax,1)
  addl   $0x1,-0xc70(%rbp)
L125:
  cmpl   $0x19,-0xc70(%rbp)
  jle    L117
  movl   $0x0,-0xc70(%rbp)
  jmp    L144
L105:
  mov    -0xc70(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  add    %rax,%rax
  add    %rbp,%rax
  sub    $0xc60,%rax
  movb   $0x2b,(%rax)
  addl   $0x1,-0xc70(%rbp)
L144:
  cmpl   $0x78,-0xc70(%rbp)
  jle    L105
  movl   $0x0,-0xc68(%rbp)
  jmp    L71
L100:
  mov    -0xc68(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0xc78(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  lea    0x3(%rax),%edx
  test   %eax,%eax
  cmovs  %edx,%eax
  sar    $0x2,%eax
  mov    %eax,-0xc64(%rbp)
  movl   $0x1,-0xc70(%rbp)
  jmp    L27
L111:
  mov    -0xc68(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    -0xc70(%rbp),%eax
  movslq %eax,%rcx
  movslq %edx,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  add    %rax,%rax
  add    %rbp,%rax
  add    %rcx,%rax
  sub    $0xc60,%rax
  movb   $0x2a,(%rax)
  addl   $0x1,-0xc70(%rbp)
L27:
  mov    -0xc70(%rbp),%eax
  cmp    -0xc64(%rbp),%eax
  jl     L111
  addl   $0x1,-0xc68(%rbp)
L71:
  mov    -0xc68(%rbp),%eax
  cmp    -0xc7c(%rbp),%eax
  jl     L100
  movl   $0x0,-0xc70(%rbp)
  jmp    L145
L49:
  movl   $0x0,-0xc6c(%rbp)
  jmp    L104
L131:
  mov    $0x19,%eax
  sub    -0xc70(%rbp),%eax
  movslq %eax,%rcx
  mov    -0xc6c(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  add    %rax,%rax
  add    %rbp,%rax
  add    %rcx,%rax
  sub    $0xc60,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <putchar@plt>
  addl   $0x1,-0xc6c(%rbp)
L104:
  cmpl   $0x78,-0xc6c(%rbp)
  jle    L131
  mov    $0xa,%edi
  call   <putchar@plt>
  addl   $0x1,-0xc70(%rbp)
L145:
  cmpl   $0x19,-0xc70(%rbp)
  jle    L49
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L142
  call   <__stack_chk_fail@plt>
L142:
  leave
  ret
```

assistant: ```c
void print_hist(int *data, int nr_data) {
  char plot[120 + 1][25 + 1];
  int i, j, k, nr_dots;
  for (i = 0; i < 120 + 1; i++)
    memset(plot[i], ' ', sizeof(plot[i]));
  for (i = 0; i < 25 + 1; i++)
    plot[0][i] = '+';
  for (i = 0; i < 120 + 1; i++)
    plot[i][0] = '+';
  for (k = 0; k < nr_data; k++) {
    nr_dots = data[k] / (100 / 25);
    for (i = 1; i < nr_dots; i++)
      plot[k + 1][i] = '*';
  }
  for (i = 0; i < 25 + 1; i++) {
    for (j = 0; j < 120 + 1; j++)
      printf("%c", plot[j][25 - i]);
    printf("\n");
  }
}
```