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

```asm
<xxtea_uint_decrypt>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    -0x30(%rbp),%rax
  sub    $0x1,%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x10(%rbp),%eax
  lea    0x1(%rax),%edi
  mov    $0x34,%eax
  cltd
  idiv   %edi
  add    $0x6,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  imul   $0x9e3779b9,%eax,%eax
  mov    %eax,-0x14(%rbp)
  cmpl   $0x0,-0x10(%rbp)
  jg     L19
  mov    -0x28(%rbp),%rax
  jmp    L35
L43:
  mov    -0x14(%rbp),%eax
  sar    $0x2,%eax
  and    $0x3,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x10(%rbp),%eax
  mov    %eax,-0x18(%rbp)
  jmp    L11
L40:
  mov    -0x18(%rbp),%eax
  cltq
  shl    $0x2,%rax
  lea    -0x4(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x4(%rbp),%eax
  sar    $0x5,%eax
  mov    %eax,%ecx
  mov    -0x1c(%rbp),%eax
  shl    $0x2,%eax
  xor    %eax,%ecx
  mov    -0x1c(%rbp),%eax
  sar    $0x3,%eax
  mov    %eax,%esi
  mov    -0x4(%rbp),%eax
  shl    $0x4,%eax
  xor    %esi,%eax
  lea    (%rcx,%rax,1),%esi
  mov    -0x14(%rbp),%eax
  xor    -0x1c(%rbp),%eax
  mov    %eax,%ecx
  mov    -0x18(%rbp),%eax
  and    $0x3,%eax
  xor    -0x8(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdi
  mov    -0x38(%rbp),%rax
  add    %rdi,%rax
  mov    (%rax),%eax
  xor    -0x4(%rbp),%eax
  add    %ecx,%eax
  xor    %eax,%esi
  mov    %esi,%ecx
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rsi
  mov    -0x28(%rbp),%rax
  add    %rsi,%rax
  sub    %ecx,%edx
  mov    %edx,(%rax)
  mov    (%rax),%eax
  mov    %eax,-0x1c(%rbp)
  subl   $0x1,-0x18(%rbp)
L11:
  cmpl   $0x0,-0x18(%rbp)
  jg     L40
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x28(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x4(%rbp),%eax
  sar    $0x5,%eax
  mov    %eax,%ecx
  mov    -0x1c(%rbp),%eax
  shl    $0x2,%eax
  xor    %eax,%ecx
  mov    -0x1c(%rbp),%eax
  sar    $0x3,%eax
  mov    %eax,%esi
  mov    -0x4(%rbp),%eax
  shl    $0x4,%eax
  xor    %esi,%eax
  lea    (%rcx,%rax,1),%esi
  mov    -0x14(%rbp),%eax
  xor    -0x1c(%rbp),%eax
  mov    %eax,%ecx
  mov    -0x18(%rbp),%eax
  and    $0x3,%eax
  xor    -0x8(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdi
  mov    -0x38(%rbp),%rax
  add    %rdi,%rax
  mov    (%rax),%eax
  xor    -0x4(%rbp),%eax
  add    %ecx,%eax
  xor    %esi,%eax
  sub    %eax,%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x14(%rbp),%eax
  add    $0x61c88647,%eax
  mov    %eax,-0x14(%rbp)
L19:
  cmpl   $0x0,-0x14(%rbp)
  jne    L43
  mov    -0x28(%rbp),%rax
L35:
  pop    %rbp
  ret
```

assistant: ```c
uint32_t *xxtea_uint_decrypt(uint32_t *data, size_t len, uint32_t *key) {
  uint32_t n = (uint32_t)len - 1;
  uint32_t z, y = data[0], p, q = 6 + 52 / (n + 1), sum = q * 0x9e3779b9, e;
  if (n < 1)
    return data;
  while (sum != 0) {
    e = sum >> 2 & 3;
    for (p = n; p > 0; p--) {
      z = data[p - 1];
      y = data[p] -= (((z >> 5) ^ (y << 2)) + ((y >> 3) ^ (z << 4))) ^ ((sum ^ y) + (key[(p & 3) ^ e] ^ z));
    }
    z = data[n];
    y = data[0] -= (((z >> 5) ^ (y << 2)) + ((y >> 3) ^ (z << 4))) ^ ((sum ^ y) + (key[(p & 3) ^ e] ^ z));
    sum -= 0x9e3779b9;
  }
  return data;
}
```