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

```asm
<update_crc>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %edi,-0x4(%rbp)
  mov    %rsi,-0x10(%rbp)
  mov    %edx,-0x8(%rbp)
  sarl   $0x2,-0x8(%rbp)
  jmp    L9
L1:
  mov    -0x10(%rbp),%rax
  mov    (%rax),%eax
  xor    %eax,-0x4(%rbp)
  addq   $0x10,-0x10(%rbp)
  mov    -0x4(%rbp),%eax
  shl    $0x4,%eax
  mov    %eax,%ecx
  mov    -0x4(%rbp),%eax
  sar    $0x1c,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  lea    D6(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  xor    %ecx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  shl    $0x4,%eax
  mov    %eax,%ecx
  mov    -0x4(%rbp),%eax
  sar    $0x1c,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  lea    D6(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  xor    %ecx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  shl    $0x4,%eax
  mov    %eax,%ecx
  mov    -0x4(%rbp),%eax
  sar    $0x1c,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  lea    D6(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  xor    %ecx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  shl    $0x4,%eax
  mov    %eax,%ecx
  mov    -0x4(%rbp),%eax
  sar    $0x1c,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  lea    D6(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  xor    %ecx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  shl    $0x4,%eax
  mov    %eax,%ecx
  mov    -0x4(%rbp),%eax
  sar    $0x1c,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  lea    D6(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  xor    %ecx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  shl    $0x4,%eax
  mov    %eax,%ecx
  mov    -0x4(%rbp),%eax
  sar    $0x1c,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  lea    D6(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  xor    %ecx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  shl    $0x4,%eax
  mov    %eax,%ecx
  mov    -0x4(%rbp),%eax
  sar    $0x1c,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  lea    D6(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  xor    %ecx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  shl    $0x4,%eax
  mov    %eax,%ecx
  mov    -0x4(%rbp),%eax
  sar    $0x1c,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  lea    D6(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  xor    %ecx,%eax
  mov    %eax,-0x4(%rbp)
L9:
  mov    -0x8(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x8(%rbp)
  test   %eax,%eax
  jne    L1
  mov    -0x4(%rbp),%eax
  pop    %rbp
  ret
```

tool_calls: name: retrieve_data
arguments: tag: D6
datatype: string

tool: 

assistant: ```c
uint32_t update_crc(uint32_t Crc, uint8_t *Buffer, uint32_t Size) {
  Size = Size >> 2;
  while (Size--) {
    static const uint32_t CrcTable[16] = {0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9, 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005, 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61, 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD};
    Crc = Crc ^ *((uint32_t *)Buffer);
    Buffer += 4;
    Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
    Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
    Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
    Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
    Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
    Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
    Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
    Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
  }
  return (Crc);
}
```