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

```asm
<unzip>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    $0x8,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <read_bits@plt>
  cmp    $0x1f,%eax
  jne    L108
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    $0x8,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <read_bits@plt>
  cmp    $0x8b,%eax
  je     L26
L108:
  mov    $0xffffffff,%eax
  jmp    L58
L26:
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    $0x8,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <read_bits@plt>
  mov    %al,-0x6(%rbp)
  cmpb   $0x8,-0x6(%rbp)
  je     L76
  mov    $0xffffffff,%eax
  jmp    L58
L76:
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    $0x8,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <read_bits@plt>
  mov    %al,-0x5(%rbp)
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    $0x20,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <read_bits@plt>
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    $0x8,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <read_bits@plt>
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    $0x8,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <read_bits@plt>
  movzbl -0x5(%rbp),%eax
  and    $0x4,%eax
  test   %eax,%eax
  je     L99
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    $0x10,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <read_bits@plt>
  mov    %eax,-0x4(%rbp)
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x4(%rbp),%eax
  shl    $0x3,%rax
  add    %rax,%rdx
  mov    -0x20(%rbp),%rax
  mov    %rdx,(%rax)
L99:
  movzbl -0x5(%rbp),%eax
  and    $0x8,%eax
  test   %eax,%eax
  je     L39
  nop
L104:
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    $0x8,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <read_bits@plt>
  test   %eax,%eax
  jne    L104
L39:
  movzbl -0x5(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L107
  nop
L73:
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    $0x8,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <read_bits@plt>
  test   %eax,%eax
  jne    L73
L107:
  movzbl -0x5(%rbp),%eax
  and    $0x2,%eax
  test   %eax,%eax
  je     L33
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    $0x10,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <read_bits@plt>
L33:
  mov    -0x28(%rbp),%rdx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <inflate@plt>
L58:
  leave
  ret
```

assistant: ```c
int unzip(const unsigned char *data, long *p, void (*callback)(unsigned char d)) {
  unsigned char cm, flg;
  if (read_bits(data, p, 8) != 0x1f || read_bits(data, p, 8) != 0x8b) {
    return -1;
  }
  cm = read_bits(data, p, 8);
  if (cm != 0x8) {
    return -1;
  }
  flg = read_bits(data, p, 8);
  if (flg & 0xe0)
    ;
  read_bits(data, p, 32);
  read_bits(data, p, 8);
  read_bits(data, p, 8);
  if (flg & 0x4) {
    unsigned int xlen;
    xlen = read_bits(data, p, 16);
    *p += ((long)xlen) * 8;
  }
  if (flg & 0x8) {
    while (read_bits(data, p, 8))
      ;
  }
  if (flg & 0x10) {
    while (read_bits(data, p, 8))
      ;
  }
  if (flg & 0x2)
    read_bits(data, p, 16);
  return inflate(data, p, callback);
}
```