user: 请从给定的汇编指令推导出C源代码：

```asm
<get_data>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,%r15
  mov    %rsi,0x8(%rsp)
  mov    %rdx,0x10(%rsp)
  mov    %rcx,0x18(%rsp)
  mov    %r8,0x20(%rsp)
  mov    %r9,0x28(%rsp)
  mov    0x70(%rsp),%r13
  jmp    L372
L517:
  movzbl %al,%ebx
  mov    %ebx,%edi
  call   <pushout@plt>
  mov    %ebx,%edi
  call   *%r13
L372:
  mov    $0xf,%r9d
  mov    0x18(%rsp),%r8
  mov    $0x120,%ecx
  mov    0x10(%rsp),%rdx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <decode_one@plt>
  cmp    $0xff,%eax
  jbe    L517
  cmp    $0x100,%eax
  je     L653
  sub    $0x101,%eax
  cmp    $0x1c,%eax
  ja     L500
  mov    %eax,%eax
  lea    D2(%rip),%rcx
  movslq (%rcx,%rax,4),%rax
  add    %rcx,%rax
  notrack jmp *%rax
  mov    $0x5,%r12d
L482:
  mov    $0xf,%r9d
  mov    0x28(%rsp),%r8
  mov    $0x1e,%ecx
  mov    0x20(%rsp),%rdx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <decode_one@plt>
  cmp    $0x1d,%eax
  ja     L25
  mov    %eax,%eax
  lea    D22(%rip),%rsi
  movslq (%rsi,%rax,4),%rax
  add    %rsi,%rax
  notrack jmp *%rax
  mov    $0x7,%r12d
  jmp    L482
  mov    $0x8,%r12d
  jmp    L482
  mov    $0x9,%r12d
  jmp    L482
  mov    $0xa,%r12d
  jmp    L482
  mov    $0x1,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0xb(%rax),%r12d
  jmp    L157
  mov    $0x1,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0xd(%rax),%r12d
  jmp    L157
  mov    $0x1,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0xf(%rax),%r12d
  jmp    L157
  mov    $0x1,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x11(%rax),%r12d
  jmp    L157
  mov    $0x2,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x13(%rax),%r12d
  jmp    L157
  mov    $0x2,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x17(%rax),%r12d
  jmp    L157
  mov    $0x2,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x1b(%rax),%r12d
  jmp    L157
  mov    $0x2,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x1f(%rax),%r12d
  jmp    L157
  mov    $0x3,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x23(%rax),%r12d
  jmp    L157
  mov    $0x3,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x2b(%rax),%r12d
  jmp    L157
  mov    $0x3,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x33(%rax),%r12d
  jmp    L157
  mov    $0x3,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x3b(%rax),%r12d
  jmp    L157
  mov    $0x4,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x43(%rax),%r12d
  jmp    L157
  mov    $0x4,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x53(%rax),%r12d
  jmp    L157
  mov    $0x4,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x63(%rax),%r12d
  jmp    L157
  mov    $0x4,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x73(%rax),%r12d
  jmp    L157
  mov    $0x5,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x83(%rax),%r12d
  jmp    L157
  mov    $0x5,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0xa3(%rax),%r12d
  jmp    L157
  mov    $0x5,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0xc3(%rax),%r12d
  jmp    L157
  mov    $0x5,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0xe3(%rax),%r12d
  jmp    L157
  mov    $0x102,%r12d
  jmp    L482
  mov    $0x3,%r12d
L157:
  mov    $0xf,%r9d
  mov    0x28(%rsp),%r8
  mov    $0x1e,%ecx
  mov    0x20(%rsp),%rdx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <decode_one@plt>
  cmp    $0x1d,%eax
  ja     L512
  mov    %eax,%eax
  lea    D26(%rip),%rdx
  movslq (%rdx,%rax,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  mov    $0x2,%r14d
L5:
  test   %r12d,%r12d
  je     L372
L163:
  mov    $0x0,%ebp
L132:
  mov    %r14d,%edi
  call   <pushin@plt>
  movzbl %al,%ebx
  mov    %ebx,%edi
  call   <pushout@plt>
  mov    %ebx,%edi
  call   *%r13
  add    $0x1,%ebp
  cmp    %r12d,%ebp
  jb     L132
  jmp    L372
  mov    $0x3,%r14d
  jmp    L5
  mov    $0x4,%r14d
  jmp    L5
  mov    $0x1,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x5(%rax),%r14d
  jmp    L5
  mov    $0x1,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x7(%rax),%r14d
  jmp    L5
  mov    $0x2,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x9(%rax),%r14d
  jmp    L5
  mov    $0x2,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0xd(%rax),%r14d
  jmp    L5
  mov    $0x3,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x11(%rax),%r14d
  jmp    L5
  mov    $0x3,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x19(%rax),%r14d
  jmp    L5
  mov    $0x4,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x21(%rax),%r14d
  jmp    L5
  mov    $0x4,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x31(%rax),%r14d
  jmp    L5
  mov    $0x5,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x41(%rax),%r14d
  jmp    L5
  mov    $0x5,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x61(%rax),%r14d
  jmp    L5
  mov    $0x6,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x81(%rax),%r14d
  jmp    L5
  mov    $0x6,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0xc1(%rax),%r14d
  jmp    L5
  mov    $0x7,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x101(%rax),%r14d
  jmp    L5
  mov    $0x7,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x181(%rax),%r14d
  jmp    L5
  mov    $0x8,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x201(%rax),%r14d
  jmp    L5
  mov    $0x8,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x301(%rax),%r14d
  jmp    L5
  mov    $0x9,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x401(%rax),%r14d
  jmp    L5
  mov    $0x9,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x601(%rax),%r14d
  jmp    L5
  mov    $0xa,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x801(%rax),%r14d
  jmp    L5
  mov    $0xa,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0xc01(%rax),%r14d
  jmp    L5
  mov    $0xb,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x1001(%rax),%r14d
  jmp    L5
  mov    $0xb,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x1801(%rax),%r14d
  jmp    L5
  mov    $0xc,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x2001(%rax),%r14d
  jmp    L5
  mov    $0xc,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x3001(%rax),%r14d
  jmp    L5
  mov    $0xd,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x4001(%rax),%r14d
  jmp    L5
  mov    $0xd,%edx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <read_bits@plt>
  lea    0x6001(%rax),%r14d
  jmp    L5
  mov    $0x1,%r14d
  jmp    L5
  mov    $0x1,%r14d
  jmp    L163
L653:
  mov    $0x0,%eax
L330:
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L500:
  mov    $0xffffffff,%eax
  jmp    L330
L512:
  mov    $0xffffffff,%eax
  jmp    L330
L25:
  mov    $0xffffffff,%eax
  jmp    L330
  mov    $0x4,%r12d
  jmp    L482
  mov    $0x6,%r12d
  jmp    L482
```

assistant: ```c
int get_data(const unsigned char *data, long *p, const char hlit_size_table[288], const unsigned int hlit_code_table[288], const char hdist_size_table[30], const unsigned int hdist_code_table[30], void (*callback)(unsigned char d)) {
  unsigned int b;
  while (1) {
    b = decode_one(data, p, hlit_size_table, 288, hlit_code_table, 15);
    if (b < 0)
      return -1;
    if (b < 256) {
      pushout((unsigned char)b);
      callback((unsigned char)b);
    } else if (b == 256)
      return 0;
    else if (b >= 257) {
      unsigned int bb;
      unsigned int length, dist;
      unsigned int l;
      switch (b) {
      case 257:
        length = 3;
        break;
      case 258:
        length = 4;
        break;
      case 259:
        length = 5;
        break;
      case 260:
        length = 6;
        break;
      case 261:
        length = 7;
        break;
      case 262:
        length = 8;
        break;
      case 263:
        length = 9;
        break;
      case 264:
        length = 10;
        break;
      case 265:
        length = 11 + read_bits(data, p, 1);
        break;
      case 266:
        length = 13 + read_bits(data, p, 1);
        break;
      case 267:
        length = 15 + read_bits(data, p, 1);
        break;
      case 268:
        length = 17 + read_bits(data, p, 1);
        break;
      case 269:
        length = 19 + read_bits(data, p, 2);
        break;
      case 270:
        length = 23 + read_bits(data, p, 2);
        break;
      case 271:
        length = 27 + read_bits(data, p, 2);
        break;
      case 272:
        length = 31 + read_bits(data, p, 2);
        break;
      case 273:
        length = 35 + read_bits(data, p, 3);
        break;
      case 274:
        length = 43 + read_bits(data, p, 3);
        break;
      case 275:
        length = 51 + read_bits(data, p, 3);
        break;
      case 276:
        length = 59 + read_bits(data, p, 3);
        break;
      case 277:
        length = 67 + read_bits(data, p, 4);
        break;
      case 278:
        length = 83 + read_bits(data, p, 4);
        break;
      case 279:
        length = 99 + read_bits(data, p, 4);
        break;
      case 280:
        length = 115 + read_bits(data, p, 4);
        break;
      case 281:
        length = 131 + read_bits(data, p, 5);
        break;
      case 282:
        length = 163 + read_bits(data, p, 5);
        break;
      case 283:
        length = 195 + read_bits(data, p, 5);
        break;
      case 284:
        length = 227 + read_bits(data, p, 5);
        break;
      case 285:
        length = 258;
        break;
      default:
        return -1;
      }
      bb = decode_one(data, p, hdist_size_table, 30, hdist_code_table, 15);
      switch (bb) {
      case 0:
        dist = 1;
        break;
      case 1:
        dist = 2;
        break;
      case 2:
        dist = 3;
        break;
      case 3:
        dist = 4;
        break;
      case 4:
        dist = 5 + read_bits(data, p, 1);
        break;
      case 5:
        dist = 7 + read_bits(data, p, 1);
        break;
      case 6:
        dist = 9 + read_bits(data, p, 2);
        break;
      case 7:
        dist = 13 + read_bits(data, p, 2);
        break;
      case 8:
        dist = 17 + read_bits(data, p, 3);
        break;
      case 9:
        dist = 25 + read_bits(data, p, 3);
        break;
      case 10:
        dist = 33 + read_bits(data, p, 4);
        break;
      case 11:
        dist = 49 + read_bits(data, p, 4);
        break;
      case 12:
        dist = 65 + read_bits(data, p, 5);
        break;
      case 13:
        dist = 97 + read_bits(data, p, 5);
        break;
      case 14:
        dist = 129 + read_bits(data, p, 6);
        break;
      case 15:
        dist = 193 + read_bits(data, p, 6);
        break;
      case 16:
        dist = 257 + read_bits(data, p, 7);
        break;
      case 17:
        dist = 385 + read_bits(data, p, 7);
        break;
      case 18:
        dist = 513 + read_bits(data, p, 8);
        break;
      case 19:
        dist = 769 + read_bits(data, p, 8);
        break;
      case 20:
        dist = 1025 + read_bits(data, p, 9);
        break;
      case 21:
        dist = 1537 + read_bits(data, p, 9);
        break;
      case 22:
        dist = 2049 + read_bits(data, p, 10);
        break;
      case 23:
        dist = 3073 + read_bits(data, p, 10);
        break;
      case 24:
        dist = 4097 + read_bits(data, p, 11);
        break;
      case 25:
        dist = 6145 + read_bits(data, p, 11);
        break;
      case 26:
        dist = 8193 + read_bits(data, p, 12);
        break;
      case 27:
        dist = 12289 + read_bits(data, p, 12);
        break;
      case 28:
        dist = 16385 + read_bits(data, p, 13);
        break;
      case 29:
        dist = 24577 + read_bits(data, p, 13);
        break;
      default:
        return -1;
      }
      for (l = 0; l < length; l++) {
        unsigned char ch;
        ch = pushin(dist);
        pushout(ch);
        callback(ch);
      }
    }
  }
  return 0;
}
```