user: 下面的汇编指令对应的C源代码是什么：

```asm
<map_hash>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  mov    %rdi,-0x10(%rbp)
  mov    %rsi,-0x18(%rbp)
  mov    $0x1505,%ebx
  jmp    L20
L22:
  mov    %ebx,%eax
  shl    $0x5,%eax
  lea    (%rbx,%rax,1),%ecx
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    (%rcx,%rax,1),%ebx
  mov    %ebx,%eax
  shl    $0x5,%eax
  lea    (%rbx,%rax,1),%ecx
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    (%rcx,%rax,1),%ebx
  mov    %ebx,%eax
  shl    $0x5,%eax
  lea    (%rbx,%rax,1),%ecx
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    (%rcx,%rax,1),%ebx
  mov    %ebx,%eax
  shl    $0x5,%eax
  lea    (%rbx,%rax,1),%ecx
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    (%rcx,%rax,1),%ebx
  mov    %ebx,%eax
  shl    $0x5,%eax
  lea    (%rbx,%rax,1),%ecx
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    (%rcx,%rax,1),%ebx
  mov    %ebx,%eax
  shl    $0x5,%eax
  lea    (%rbx,%rax,1),%ecx
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    (%rcx,%rax,1),%ebx
  mov    %ebx,%eax
  shl    $0x5,%eax
  lea    (%rbx,%rax,1),%ecx
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    (%rcx,%rax,1),%ebx
  mov    %ebx,%eax
  shl    $0x5,%eax
  lea    (%rbx,%rax,1),%ecx
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    (%rcx,%rax,1),%ebx
  subq   $0x8,-0x18(%rbp)
L20:
  cmpq   $0x7,-0x18(%rbp)
  ja     L22
  cmpq   $0x7,-0x18(%rbp)
  ja     L6
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  lea    D12(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D12(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    %ebx,%eax
  shl    $0x5,%eax
  lea    (%rbx,%rax,1),%ecx
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    (%rcx,%rax,1),%ebx
  mov    %ebx,%eax
  shl    $0x5,%eax
  lea    (%rbx,%rax,1),%ecx
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    (%rcx,%rax,1),%ebx
  mov    %ebx,%eax
  shl    $0x5,%eax
  lea    (%rbx,%rax,1),%ecx
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    (%rcx,%rax,1),%ebx
  mov    %ebx,%eax
  shl    $0x5,%eax
  lea    (%rbx,%rax,1),%ecx
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    (%rcx,%rax,1),%ebx
  mov    %ebx,%eax
  shl    $0x5,%eax
  lea    (%rbx,%rax,1),%ecx
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    (%rcx,%rax,1),%ebx
  mov    %ebx,%eax
  shl    $0x5,%eax
  lea    (%rbx,%rax,1),%ecx
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    (%rcx,%rax,1),%ebx
  mov    %ebx,%eax
  shl    $0x5,%eax
  lea    (%rbx,%rax,1),%ecx
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    (%rcx,%rax,1),%ebx
  jmp    L6
  nop
L6:
  mov    %ebx,%eax
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
uint32_t map_hash(char *key, size_t len) {
  register int hash = 5381;
  for (; len >= 8; len -= 8) {
    hash = ((hash << 5) + hash) + *key++;
    hash = ((hash << 5) + hash) + *key++;
    hash = ((hash << 5) + hash) + *key++;
    hash = ((hash << 5) + hash) + *key++;
    hash = ((hash << 5) + hash) + *key++;
    hash = ((hash << 5) + hash) + *key++;
    hash = ((hash << 5) + hash) + *key++;
    hash = ((hash << 5) + hash) + *key++;
  }
  switch (len) {
  case 7:
    hash = ((hash << 5) + hash) + *key++;
  case 6:
    hash = ((hash << 5) + hash) + *key++;
  case 5:
    hash = ((hash << 5) + hash) + *key++;
  case 4:
    hash = ((hash << 5) + hash) + *key++;
  case 3:
    hash = ((hash << 5) + hash) + *key++;
  case 2:
    hash = ((hash << 5) + hash) + *key++;
  case 1:
    hash = ((hash << 5) + hash) + *key++;
    break;
  case 0:
    break;
  }
  return hash;
}
```