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,-0x14(%rbp)
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x14(%rbp),%eax
  cltq
  add    $0x1,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x14(%rbp),%eax
  lea    0x2(%rax),%edx
  mov    -0x28(%rbp),%rax
  sub    $0xffffffffffffff80,%rax
  and    $0x1f,%edx
  mov    %edx,(%rax)
  mov    (%rax),%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x14(%rbp),%eax
  cltq
  add    $0x1,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  shl    $0x1f,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%eax
  sar    %eax
  or     %edx,%eax
  xor    %eax,-0x4(%rbp)
  mov    -0x8(%rbp),%eax
  shl    $0x1f,%eax
  xor    %eax,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  xor    -0x10(%rbp),%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%eax
  sar    $0xb,%eax
  mov    %eax,%ecx
  mov    -0x4(%rbp),%eax
  shl    $0x15,%eax
  or     %ecx,%eax
  mov    %edx,%ecx
  xor    %eax,%ecx
  mov    -0x10(%rbp),%eax
  sar    $0x1e,%eax
  mov    %eax,%edx
  mov    -0xc(%rbp),%eax
  shl    $0x2,%eax
  or     %eax,%edx
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rsi
  mov    -0x28(%rbp),%rax
  add    %rsi,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x4(%rbp),%eax
  xor    -0xc(%rbp),%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  sar    $0xb,%eax
  mov    %edx,%ecx
  xor    %eax,%ecx
  mov    -0xc(%rbp),%eax
  sar    $0x1e,%eax
  mov    %eax,%edx
  mov    -0x14(%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    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  and    $0xffff,%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x10(%rbp),%eax
  imul   $0xfdb5,%eax,%eax
  sar    $0x10,%eax
  mov    %eax,%ecx
  mov    -0x14(%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    -0x10(%rbp),%eax
  imul   $0x89d45497,%eax,%eax
  add    %edx,%eax
  lea    (%rcx,%rax,1),%edx
  mov    -0x14(%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 *state) {
  int p;
  uint32_t x, y, z, w;
  p = state[32];
  x = state[p];
  y = state[p + 1];
  p = state[32] = (p + 2) & 31;
  z = state[p];
  w = state[p + 1];
  w ^= (w << 31) | (z >> 1);
  z ^= z << 31;
  state[p] = z ^ x ^ ((z >> 11) | (w << 21)) ^ ((x >> 30) | (y << 2));
  state[p + 1] = w ^ y ^ (w >> 11) ^ (y >> 30);
  x = state[p] & 0xFFFF;
  return (x * 64949 >> 16) + x * 2312393879 + (state[p] >> 16) * 1419247029 + state[p + 1] * 4256497664;
}
```