user: 请将以下的汇编代码转换成C语言代码：

```asm
<get_data>:
  endbr64
  push   %r15
  push   %r14
  mov    %rdi,%r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rsi,0x8(%rsp)
  mov    0x70(%rsp),%r12
  mov    %rdx,0x10(%rsp)
  mov    %rcx,0x18(%rsp)
  mov    %r8,0x20(%rsp)
  mov    %r9,0x28(%rsp)
  nopl   0x0(%rax,%rax,1)
L34:
  mov    0x18(%rsp),%r8
  mov    0x10(%rsp),%rdx
  mov    $0x120,%ecx
  mov    $0xf,%r9d
  mov    0x8(%rsp),%rsi
  mov    %r14,%rdi
  call   <decode_one@plt>
  mov    %eax,%ebp
  cmp    $0xff,%eax
  jbe    L107
  cmp    $0x100,%eax
  je     L321
  sub    $0x101,%ebp
  cmp    $0x1c,%ebp
  ja     L426
  lea    D4(%rip),%rcx
  movslq (%rcx,%rbp,4),%rax
  add    %rcx,%rax
  notrack jmp *%rax
  nopw   0x0(%rax,%rax,1)
L107:
  mov    %eax,%edi
  call   <pushout@plt>
  mov    %ebp,%edi
  call   *%r12
  jmp    L34
L426:
  add    $0x38,%rsp
  mov    $0xffffffff,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  mov    $0x6,%ebx
  nopw   0x0(%rax,%rax,1)
L90:
  mov    0x28(%rsp),%r8
  mov    0x20(%rsp),%rdx
  mov    $0x1e,%ecx
  mov    $0xf,%r9d
  mov    0x8(%rsp),%rsi
  mov    %r14,%rdi
  call   <decode_one@plt>
  cmp    $0x1d,%eax
  ja     L426
  lea    D29(%rip),%rsi
  mov    %eax,%eax
  movslq (%rsi,%rax,4),%rax
  add    %rsi,%rax
  notrack jmp *%rax
  mov    $0x5,%ebx
  jmp    L90
  mov    $0x3,%ebx
  cs nopw 0x0(%rax,%rax,1)
L513:
  mov    0x28(%rsp),%r8
  mov    0x20(%rsp),%rdx
  mov    $0x1e,%ecx
  mov    $0xf,%r9d
  mov    0x8(%rsp),%rsi
  mov    %r14,%rdi
  call   <decode_one@plt>
  cmp    $0x1d,%eax
  ja     L426
  lea    D5(%rip),%rdx
  mov    %eax,%eax
  movslq (%rdx,%rax,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  mov    $0x4,%ebx
  jmp    L90
  mov    $0x102,%ebx
  jmp    L90
  mov    0x8(%rsp),%rsi
  mov    $0x3,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x3b(%rax),%ebx
  jmp    L513
  mov    0x8(%rsp),%rsi
  mov    $0x3,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x33(%rax),%ebx
  jmp    L513
  mov    0x8(%rsp),%rsi
  mov    $0x3,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x2b(%rax),%ebx
  jmp    L513
  mov    0x8(%rsp),%rsi
  mov    $0x3,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x23(%rax),%ebx
  jmp    L513
  mov    0x8(%rsp),%rsi
  mov    $0x2,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x1f(%rax),%ebx
  jmp    L513
  mov    0x8(%rsp),%rsi
  mov    $0x2,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x1b(%rax),%ebx
  jmp    L513
  mov    0x8(%rsp),%rsi
  mov    $0x2,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x17(%rax),%ebx
  jmp    L513
  mov    0x8(%rsp),%rsi
  mov    $0x2,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x13(%rax),%ebx
  jmp    L513
  mov    0x8(%rsp),%rsi
  mov    $0x1,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x11(%rax),%ebx
  jmp    L513
  mov    0x8(%rsp),%rsi
  mov    $0x1,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0xf(%rax),%ebx
  jmp    L513
  mov    0x8(%rsp),%rsi
  mov    $0x1,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0xd(%rax),%ebx
  jmp    L513
  mov    0x8(%rsp),%rsi
  mov    $0x1,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0xb(%rax),%ebx
  jmp    L513
  mov    $0xa,%ebx
  jmp    L90
  mov    $0x9,%ebx
  jmp    L90
  mov    $0x8,%ebx
  jmp    L90
  mov    $0x7,%ebx
  jmp    L90
  mov    0x8(%rsp),%rsi
  mov    $0x5,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0xe3(%rax),%ebx
  jmp    L513
  mov    0x8(%rsp),%rsi
  mov    $0x5,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0xc3(%rax),%ebx
  jmp    L513
  mov    0x8(%rsp),%rsi
  mov    $0x5,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0xa3(%rax),%ebx
  jmp    L513
  mov    0x8(%rsp),%rsi
  mov    $0x5,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x83(%rax),%ebx
  jmp    L513
  mov    0x8(%rsp),%rsi
  mov    $0x4,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x73(%rax),%ebx
  jmp    L513
  mov    0x8(%rsp),%rsi
  mov    $0x4,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x63(%rax),%ebx
  jmp    L513
  mov    0x8(%rsp),%rsi
  mov    $0x4,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x53(%rax),%ebx
  jmp    L513
  mov    0x8(%rsp),%rsi
  mov    $0x4,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x43(%rax),%ebx
  jmp    L513
  mov    0x8(%rsp),%rsi
  mov    $0x8,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x301(%rax),%ebp
L455:
  test   %ebx,%ebx
  je     L34
L477:
  xor    %r15d,%r15d
  nopl   0x0(%rax,%rax,1)
L147:
  mov    %ebp,%edi
  add    $0x1,%r15d
  call   <pushin@plt>
  movzbl %al,%r13d
  mov    %r13d,%edi
  call   <pushout@plt>
  mov    %r13d,%edi
  call   *%r12
  cmp    %ebx,%r15d
  jb     L147
  jmp    L34
  mov    0x8(%rsp),%rsi
  mov    $0xc,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x3001(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0xd,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x4001(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0xc,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x2001(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0xb,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x1801(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0xb,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x1001(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0xa,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0xc01(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0xa,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x801(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0x9,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x601(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0x9,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x401(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0x8,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x201(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0x7,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x181(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0x7,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x101(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0x6,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0xc1(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0x6,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x81(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0x5,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x61(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0x5,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x41(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0x4,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x21(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0x4,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x31(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0x3,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x19(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0x3,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x11(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0x2,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0xd(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0x2,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x9(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0x1,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x7(%rax),%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0x1,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x5(%rax),%ebp
  jmp    L455
  mov    $0x4,%ebp
  jmp    L455
  mov    $0x3,%ebp
  jmp    L455
  mov    $0x2,%ebp
  jmp    L455
  mov    0x8(%rsp),%rsi
  mov    $0xd,%edx
  mov    %r14,%rdi
  call   <read_bits@plt>
  lea    0x6001(%rax),%ebp
  jmp    L455
  mov    $0x1,%ebp
  jmp    L455
L321:
  add    $0x38,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  mov    $0x1,%ebp
  jmp    L477
```

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;
}
```