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

```asm
<keccak_absorb>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x100,%rsp
  mov    %rdi,-0xe8(%rbp)
  mov    %esi,-0xec(%rbp)
  mov    %rdx,-0xf8(%rbp)
  mov    %rcx,-0x100(%rbp)
  mov    %r8d,%eax
  mov    %al,-0xf0(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0xd4(%rbp)
  jmp    L22
L18:
  mov    -0xd4(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0xe8(%rbp),%rax
  add    %rdx,%rax
  movl   $0x0,(%rax)
  addl   $0x1,-0xd4(%rbp)
L22:
  cmpl   $0x18,-0xd4(%rbp)
  jbe    L18
  jmp    L7
L66:
  movl   $0x0,-0xd4(%rbp)
  jmp    L1
L62:
  mov    -0xd4(%rbp),%eax
  shl    $0x3,%eax
  mov    %eax,%edx
  mov    -0xf8(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdi
  call   <load64@plt>
  mov    %eax,%edx
  mov    -0xd4(%rbp),%eax
  lea    0x0(,%rax,4),%rcx
  mov    -0xe8(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%ecx
  mov    -0xd4(%rbp),%eax
  lea    0x0(,%rax,4),%rsi
  mov    -0xe8(%rbp),%rax
  add    %rsi,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  addl   $0x1,-0xd4(%rbp)
L1:
  mov    -0xec(%rbp),%eax
  shr    $0x3,%eax
  cmp    %eax,-0xd4(%rbp)
  jb     L62
  mov    -0xe8(%rbp),%rax
  mov    %rax,%rdi
  call   <KeccakF1600_StatePermute@plt>
  mov    -0xec(%rbp),%eax
  sub    %rax,-0x100(%rbp)
  mov    -0xec(%rbp),%eax
  add    %rax,-0xf8(%rbp)
L7:
  mov    -0xec(%rbp),%eax
  cmp    %rax,-0x100(%rbp)
  jae    L66
  movl   $0x0,-0xd4(%rbp)
  jmp    L75
L59:
  mov    -0xd4(%rbp),%eax
  movb   $0x0,-0xd0(%rbp,%rax,1)
  addl   $0x1,-0xd4(%rbp)
L75:
  mov    -0xd4(%rbp),%eax
  cmp    -0xec(%rbp),%eax
  jb     L59
  movl   $0x0,-0xd4(%rbp)
  jmp    L121
L28:
  mov    -0xd4(%rbp),%edx
  mov    -0xf8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0xd4(%rbp),%eax
  mov    %dl,-0xd0(%rbp,%rax,1)
  addl   $0x1,-0xd4(%rbp)
L121:
  mov    -0xd4(%rbp),%eax
  cmp    %rax,-0x100(%rbp)
  ja     L28
  mov    -0xd4(%rbp),%eax
  movzbl -0xf0(%rbp),%edx
  mov    %dl,-0xd0(%rbp,%rax,1)
  mov    -0xec(%rbp),%eax
  sub    $0x1,%eax
  mov    %eax,%eax
  movzbl -0xd0(%rbp,%rax,1),%eax
  mov    -0xec(%rbp),%edx
  sub    $0x1,%edx
  or     $0xffffff80,%eax
  mov    %edx,%edx
  mov    %al,-0xd0(%rbp,%rdx,1)
  movl   $0x0,-0xd4(%rbp)
  jmp    L85
L20:
  mov    -0xd4(%rbp),%eax
  shl    $0x3,%eax
  mov    %eax,%edx
  lea    -0xd0(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdi
  call   <load64@plt>
  mov    %eax,%edx
  mov    -0xd4(%rbp),%eax
  lea    0x0(,%rax,4),%rcx
  mov    -0xe8(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%ecx
  mov    -0xd4(%rbp),%eax
  lea    0x0(,%rax,4),%rsi
  mov    -0xe8(%rbp),%rax
  add    %rsi,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  addl   $0x1,-0xd4(%rbp)
L85:
  mov    -0xec(%rbp),%eax
  shr    $0x3,%eax
  cmp    %eax,-0xd4(%rbp)
  jb     L20
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L107
  call   <__stack_chk_fail@plt>
L107:
  leave
  ret
```

assistant: ```c
void keccak_absorb(uint64_t *s, unsigned int r, const unsigned char *m, unsigned long long mlen, unsigned char p) {
  unsigned int i;
  unsigned char t[200];
  for (i = 0; i < 25; ++i)
    s[i] = 0;
  while (mlen >= r) {
    for (i = 0; i < r / 8; ++i)
      s[i] ^= load64(m + 8 * i);
    KeccakF1600_StatePermute(s);
    mlen -= r;
    m += r;
  }
  for (i = 0; i < r; ++i)
    t[i] = 0;
  for (i = 0; i < mlen; ++i)
    t[i] = m[i];
  t[i] = p;
  t[r - 1] |= 128;
  for (i = 0; i < r / 8; ++i)
    s[i] ^= load64(t + 8 * i);
}
```