user: 请从给定的汇编指令推导出C源代码：

```asm
<calc>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x1b0,%rsp
  mov    %rdi,-0x198(%rbp)
  mov    %esi,-0x19c(%rbp)
  mov    %rdx,-0x1a8(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x67452301,-0x170(%rbp)
  movl   $0xefcdab89,-0x16c(%rbp)
  movl   $0x98badcfe,-0x168(%rbp)
  movl   $0x10325476,-0x164(%rbp)
  movl   $0xc3d2e1f0,-0x160(%rbp)
  mov    -0x198(%rbp),%rax
  mov    %rax,-0x178(%rbp)
  movl   $0x0,-0x188(%rbp)
  movl   $0x0,-0x184(%rbp)
  movl   $0x40,-0x180(%rbp)
  jmp    L55
L16:
  movl   $0x0,-0x17c(%rbp)
  mov    -0x184(%rbp),%eax
  mov    %eax,-0x188(%rbp)
  jmp    L54
L95:
  mov    -0x188(%rbp),%eax
  cltq
  lea    0x3(%rax),%rdx
  mov    -0x178(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x188(%rbp),%eax
  cltq
  lea    0x2(%rax),%rcx
  mov    -0x178(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  or     %eax,%edx
  mov    -0x188(%rbp),%eax
  cltq
  lea    0x1(%rax),%rcx
  mov    -0x178(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x10,%eax
  mov    %edx,%esi
  or     %eax,%esi
  mov    -0x188(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x178(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x18,%eax
  mov    %eax,%ecx
  mov    -0x17c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x17c(%rbp)
  or     %ecx,%esi
  mov    %esi,%edx
  cltq
  mov    %edx,-0x150(%rbp,%rax,4)
  addl   $0x4,-0x188(%rbp)
L54:
  mov    -0x188(%rbp),%eax
  cmp    -0x180(%rbp),%eax
  jl     L95
  lea    -0x150(%rbp),%rdx
  lea    -0x170(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <innerHash@plt>
  mov    -0x180(%rbp),%eax
  mov    %eax,-0x184(%rbp)
  addl   $0x40,-0x180(%rbp)
L55:
  mov    -0x19c(%rbp),%eax
  sub    $0x3f,%eax
  cmp    %eax,-0x184(%rbp)
  jl     L16
  mov    -0x19c(%rbp),%eax
  sub    -0x184(%rbp),%eax
  mov    %eax,-0x180(%rbp)
  lea    -0x150(%rbp),%rax
  mov    $0x40,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  movl   $0x0,-0x188(%rbp)
  jmp    L67
L86:
  mov    -0x188(%rbp),%eax
  sar    $0x2,%eax
  cltq
  mov    -0x150(%rbp,%rax,4),%esi
  mov    -0x188(%rbp),%edx
  mov    -0x184(%rbp),%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0x178(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x188(%rbp),%eax
  not    %eax
  shl    $0x3,%eax
  and    $0x18,%eax
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    -0x188(%rbp),%eax
  sar    $0x2,%eax
  or     %esi,%edx
  cltq
  mov    %edx,-0x150(%rbp,%rax,4)
  addl   $0x1,-0x188(%rbp)
L67:
  mov    -0x188(%rbp),%eax
  cmp    -0x180(%rbp),%eax
  jl     L86
  mov    -0x188(%rbp),%eax
  sar    $0x2,%eax
  cltq
  mov    -0x150(%rbp,%rax,4),%edx
  mov    -0x188(%rbp),%eax
  not    %eax
  shl    $0x3,%eax
  and    $0x18,%eax
  mov    $0x80,%esi
  mov    %eax,%ecx
  shl    %cl,%esi
  mov    %esi,%eax
  mov    %eax,%ecx
  mov    -0x188(%rbp),%eax
  sar    $0x2,%eax
  or     %ecx,%edx
  cltq
  mov    %edx,-0x150(%rbp,%rax,4)
  cmpl   $0x37,-0x180(%rbp)
  jle    L98
  lea    -0x150(%rbp),%rdx
  lea    -0x170(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <innerHash@plt>
  lea    -0x150(%rbp),%rax
  mov    $0x40,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
L98:
  mov    -0x19c(%rbp),%eax
  shl    $0x3,%eax
  mov    %eax,-0x114(%rbp)
  lea    -0x150(%rbp),%rdx
  lea    -0x170(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <innerHash@plt>
  movl   $0x14,-0x184(%rbp)
  jmp    L11
L69:
  mov    -0x184(%rbp),%eax
  sar    $0x2,%eax
  cltq
  mov    -0x170(%rbp,%rax,4),%edx
  mov    $0x3,%eax
  sub    -0x184(%rbp),%eax
  shl    $0x3,%eax
  and    $0x18,%eax
  mov    %eax,%ecx
  shr    %cl,%edx
  mov    %edx,%ecx
  mov    -0x184(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x1a8(%rbp),%rax
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
L11:
  subl   $0x1,-0x184(%rbp)
  cmpl   $0x0,-0x184(%rbp)
  jns    L69
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L82
  call   <__stack_chk_fail@plt>
L82:
  leave
  ret
```

assistant: ```c
void calc(const void *src, const int bytelength, unsigned char *hash) {
  unsigned int result[5] = {0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0};
  const unsigned char *sarray = (const unsigned char *)src;
  unsigned int w[80];
  int j, i, i1;
  j = 0;
  for (i = 0, i1 = 64; i <= (bytelength - 64); i = i1, i1 += 64) {
    int k = 0;
    for (j = i; j < i1; j += 4) {
      w[k++] = (unsigned int)sarray[j + 3] | (((unsigned int)sarray[j + 2]) << 8) | (((unsigned int)sarray[j + 1]) << 16) | (((unsigned int)sarray[j]) << 24);
    }
    innerHash(result, w);
  }
  i1 = bytelength - i;
  memset(w, 0, sizeof(unsigned int) * 16);
  for (j = 0; j < i1; j++) {
    w[j >> 2] |= (unsigned int)sarray[j + i] << ((3 - (j & 3)) << 3);
  }
  w[j >> 2] |= 0x80 << ((3 - (j & 3)) << 3);
  if (i1 >= 56) {
    innerHash(result, w);
    memset(w, 0, sizeof(unsigned int) * 16);
  }
  w[15] = bytelength << 3;
  innerHash(result, w);
  for (i = 20; --i >= 0;) {
    hash[i] = (result[i >> 2] >> (((3 - i) & 0x3) << 3)) & 0xFF;
  }
}
```