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

```asm
<zend_hash>:
  endbr64
  push   %rbx
  mov    %rdi,%rbx
  call   <strlen@plt>
  cmp    $0x7,%rax
  jbe    L39
  mov    %rax,%rcx
  lea    -0x8(%rax),%rax
  shr    $0x3,%rax
  lea    0x8(%rbx,%rax,8),%rdx
  mov    $0x1505,%eax
  nopl   0x0(%rax)
L8:
  mov    %rax,%rsi
  add    $0x8,%rbx
  shl    $0x5,%rsi
  add    %rax,%rsi
  movsbq -0x8(%rbx),%rax
  add    %rsi,%rax
  mov    %rax,%rsi
  shl    $0x5,%rsi
  add    %rax,%rsi
  movsbq -0x7(%rbx),%rax
  add    %rsi,%rax
  mov    %rax,%rsi
  shl    $0x5,%rsi
  add    %rax,%rsi
  movsbq -0x6(%rbx),%rax
  add    %rsi,%rax
  mov    %rax,%rsi
  shl    $0x5,%rsi
  add    %rax,%rsi
  movsbq -0x5(%rbx),%rax
  add    %rsi,%rax
  mov    %rax,%rsi
  shl    $0x5,%rsi
  add    %rax,%rsi
  movsbq -0x4(%rbx),%rax
  add    %rsi,%rax
  mov    %rax,%rsi
  shl    $0x5,%rsi
  add    %rax,%rsi
  movsbq -0x3(%rbx),%rax
  add    %rsi,%rax
  mov    %rax,%rsi
  shl    $0x5,%rsi
  add    %rax,%rsi
  movsbq -0x2(%rbx),%rax
  add    %rsi,%rax
  mov    %rax,%rsi
  shl    $0x5,%rsi
  add    %rax,%rsi
  movsbq -0x1(%rbx),%rax
  add    %rsi,%rax
  cmp    %rdx,%rbx
  jne    L8
  and    $0x7,%ecx
  mov    %rcx,%rsi
L50:
  cmp    $0x7,%rsi
  ja     L33
  lea    D6(%rip),%rdi
  movslq (%rdi,%rsi,4),%rcx
  add    %rdi,%rcx
  notrack jmp *%rcx
  xchg   %ax,%ax
  mov    %rax,%rcx
  add    $0x1,%rdx
  shl    $0x5,%rcx
  add    %rax,%rcx
  movsbq -0x1(%rdx),%rax
  add    %rcx,%rax
  mov    %rax,%rcx
  add    $0x1,%rdx
  shl    $0x5,%rcx
  add    %rax,%rcx
  movsbq -0x1(%rdx),%rax
  add    %rcx,%rax
  mov    %rax,%rcx
  lea    0x1(%rdx),%rsi
  shl    $0x5,%rcx
  add    %rax,%rcx
  movsbq (%rdx),%rax
  add    %rcx,%rax
L14:
  mov    %rax,%rdx
  shl    $0x5,%rdx
  lea    (%rdx,%rax,1),%rcx
  movsbq (%rsi),%rax
  lea    0x1(%rsi),%rdx
  add    %rcx,%rax
  mov    %rax,%rcx
  lea    0x1(%rdx),%rsi
  shl    $0x5,%rcx
  add    %rax,%rcx
  movsbq (%rdx),%rax
  add    %rcx,%rax
L43:
  mov    %rax,%rdx
  shl    $0x5,%rdx
  lea    (%rdx,%rax,1),%rcx
  movsbq (%rsi),%rax
  lea    0x1(%rsi),%rdx
  add    %rcx,%rax
  mov    %rax,%rcx
  shl    $0x5,%rcx
  add    %rax,%rcx
  movsbq (%rdx),%rax
  add    %rcx,%rax
L33:
  pop    %rbx
  ret
  nopl   (%rax)
  mov    %rdx,%rsi
  jmp    L14
  nopl   (%rax)
  mov    %rdx,%rsi
  jmp    L43
  nopl   (%rax)
L39:
  mov    %rax,%rsi
  mov    %rbx,%rdx
  mov    $0x1505,%eax
  jmp    L50
```

assistant: ```c
unsigned long int zend_hash(const char *key) {
  register unsigned long int hash = 5381;
  size_t len = strlen(key);
  if (!key) {
    return 0;
  }
  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;
}
```