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

```asm
<xorshift1024star_32>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  mov    0x80(%rax),%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x18(%rbp),%eax
  cltq
  add    $0x1,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x18(%rbp),%eax
  lea    0x2(%rax),%edx
  mov    -0x28(%rbp),%rax
  sub    $0xffffffffffffff80,%rax
  and    $0x1f,%edx
  mov    %edx,(%rax)
  mov    (%rax),%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x18(%rbp),%eax
  cltq
  add    $0x1,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  shl    $0x1f,%eax
  mov    %eax,%edx
  mov    -0xc(%rbp),%eax
  sar    %eax
  or     %edx,%eax
  xor    %eax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  shl    $0x1f,%eax
  xor    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  xor    -0x14(%rbp),%eax
  mov    %eax,%edx
  mov    -0xc(%rbp),%eax
  sar    $0xb,%eax
  mov    %eax,%ecx
  mov    -0x8(%rbp),%eax
  shl    $0x15,%eax
  or     %ecx,%eax
  mov    %edx,%ecx
  xor    %eax,%ecx
  mov    -0x14(%rbp),%eax
  sar    $0x1e,%eax
  mov    %eax,%edx
  mov    -0x10(%rbp),%eax
  shl    $0x2,%eax
  or     %eax,%edx
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rsi
  mov    -0x28(%rbp),%rax
  add    %rsi,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x8(%rbp),%eax
  xor    -0x10(%rbp),%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%eax
  sar    $0xb,%eax
  mov    %edx,%ecx
  xor    %eax,%ecx
  mov    -0x10(%rbp),%eax
  sar    $0x1e,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  cltq
  add    $0x1,%rax
  lea    0x0(,%rax,4),%rsi
  mov    -0x28(%rbp),%rax
  add    %rsi,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  and    $0xffff,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  imul   $0xfdb5,%eax,%eax
  sar    $0x10,%eax
  mov    %eax,%ecx
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  sar    $0x10,%eax
  imul   $0x5497fdb5,%eax,%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  imul   $0x89d45497,%eax,%eax
  add    %edx,%eax
  lea    (%rcx,%rax,1),%edx
  mov    -0x18(%rbp),%eax
  cltq
  add    $0x1,%rax
  lea    0x0(,%rax,4),%rcx
  mov    -0x28(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%eax
  imul   $0xfdb50000,%eax,%eax
  add    %edx,%eax
  pop    %rbp
  ret
```

assistant: ```c
uint32_t xorshift1024star_32(uint32_t *s32) {
  int p = s32[32];
  const uint32_t s0l = s32[p];
  const uint32_t s0u = s32[p + 1];
  p = s32[32] = (p + 2) & 31;
  uint32_t s1l = s32[p];
  uint32_t s1u = s32[p + 1];
  s1u ^= (s1u << 31) | (s1l >> 1);
  s1l ^= s1l << 31;
  s32[p] = s1l ^ s0l ^ ((s1l >> 11) | (s1u << 21)) ^ ((s0l >> 30) | (s0u << 2));
  s32[p + 1] = s1u ^ s0u ^ (s1u >> 11) ^ (s0u >> 30);
  uint32_t lo = s32[p] & 0xFFFF;
  return (lo * 64949 >> 16) + lo * 2312393879 + (s32[p] >> 16) * 1419247029 + s32[p + 1] * 4256497664;
}
```