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

```asm
<getSipHash24b>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %rdi,0x18(%rsp)
  mov    %edx,%edi
  mov    %edx,0x14(%rsp)
  mov    %ecx,%edx
  mov    %r8d,%r12d
  mov    %ecx,%ebx
  xor    $0x70736575,%ebx
  mov    %r8d,%ebp
  xor    $0x6e646f6d,%ebp
  xor    $0x6e657261,%edx
  xor    $0x79746573,%r12d
  lea    0x8(%rdi),%ecx
  cmp    %ecx,%esi
  jg     L18
  mov    %esi,%eax
  cltq
  mov    %rax,(%rsp)
  jmp    L67
L65:
  mov    (%rsp),%edi
  cmp    %edi,0x14(%rsp)
  jle    L16
  mov    0x18(%rsp),%rcx
  mov    (%rsp),%rsi
  movzbl (%rcx,%rsi,1),%edi
  mov    %rdi,0x8(%rsp)
  mov    0x14(%rsp),%edi
  sub    $0x1,%edi
  sub    %eax,%edi
  add    $0x1,%rdi
  mov    $0x1,%eax
  add    %rsi,%rcx
  mov    %rcx,%r8
L83:
  cmp    %rax,%rdi
  je     L10
  movzbl (%r8,%rax,1),%esi
  lea    0x0(,%rax,8),%ecx
  shl    %cl,%esi
  movslq %esi,%rsi
  or     %rsi,0x8(%rsp)
  add    $0x1,%rax
  cmp    $0x8,%rax
  jne    L83
L10:
  xor    0x8(%rsp),%r12d
  mov    $0x2,%r15d
L28:
  mov    $0x0,%r13d
L39:
  add    %ebp,%ebx
  lea    (%rdx,%r12,1),%r14d
  mov    $0xd,%esi
  mov    %ebp,%edi
  call   <rotateLeft64@plt>
  mov    %eax,%ebp
  mov    $0x10,%esi
  mov    %r12d,%edi
  call   <rotateLeft64@plt>
  xor    %ebx,%ebp
  xor    %r14d,%eax
  mov    %eax,%r12d
  mov    $0x20,%esi
  mov    %ebx,%edi
  call   <rotateLeft64@plt>
  add    %ebp,%r14d
  lea    (%r12,%rax,1),%ebx
  mov    $0x11,%esi
  mov    %ebp,%edi
  call   <rotateLeft64@plt>
  mov    %eax,%ebp
  mov    $0x15,%esi
  mov    %r12d,%edi
  call   <rotateLeft64@plt>
  xor    %r14d,%ebp
  xor    %ebx,%eax
  mov    %eax,%r12d
  mov    $0x20,%esi
  mov    %r14d,%edi
  call   <rotateLeft64@plt>
  mov    %eax,%edx
  add    $0x1,%r13d
  cmp    %r13d,%r15d
  jne    L39
  xor    0x8(%rsp),%ebx
  addq   $0x8,(%rsp)
  mov    (%rsp),%rax
  sub    $0x8,%eax
  cmp    %eax,0x14(%rsp)
  jl     L18
L67:
  mov    (%rsp),%rcx
  mov    %ecx,%eax
  cmp    %ecx,0x14(%rsp)
  jge    L65
  xor    $0xff,%dl
  movq   $0x0,0x8(%rsp)
  mov    $0x4,%r15d
  jmp    L28
L16:
  movq   $0x0,0x8(%rsp)
  jmp    L10
L18:
  mov    %ebx,%eax
  xor    %ebp,%eax
  xor    %edx,%eax
  xor    %r12d,%eax
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
uint64_t getSipHash24b(char *b, int start, int end, uint64_t k0, uint64_t k1) {
  uint64_t v0 = k0 ^ 0x736f6d6570736575L;
  uint64_t v1 = k1 ^ 0x646f72616e646f6dL;
  uint64_t v2 = k0 ^ 0x6c7967656e657261L;
  uint64_t v3 = k1 ^ 0x7465646279746573L;
  int repeat;
  for (int off = start; off <= end + 8; off += 8) {
    long m;
    if (off <= end) {
      m = 0;
      int i = 0;
      for (; i < 8 && off + i < end; i++) {
        m |= ((uint64_t)b[off + i] & 255) << (8 * i);
      }
      if (i < 8) {
        m |= ((uint64_t)end - start) << 56;
      }
      v3 ^= m;
      repeat = 2;
    } else {
      m = 0;
      v2 ^= 0xff;
      repeat = 4;
    }
    for (int i = 0; i < repeat; i++) {
      v0 += v1;
      v2 += v3;
      v1 = rotateLeft64(v1, 13);
      v3 = rotateLeft64(v3, 16);
      v1 ^= v0;
      v3 ^= v2;
      v0 = rotateLeft64(v0, 32);
      v2 += v1;
      v0 += v3;
      v1 = rotateLeft64(v1, 17);
      v3 = rotateLeft64(v3, 21);
      v1 ^= v2;
      v3 ^= v0;
      v2 = rotateLeft64(v2, 32);
    }
    v0 ^= m;
  }
  return v0 ^ v1 ^ v2 ^ v3;
}
```