user: 这段汇编代码用C语言表示是什么样的：

```asm
<unpack_c>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %edi,-0x34(%rbp)
  mov    %esi,-0x38(%rbp)
  mov    %rdx,-0x40(%rbp)
  mov    %rcx,-0x48(%rbp)
  mov    %r8,-0x50(%rbp)
  mov    %r9d,-0x54(%rbp)
  movl   $0xffffffff,-0x30(%rbp)
  movl   $0x80000000,-0x28(%rbp)
  subl   $0x1,-0x54(%rbp)
  subl   $0x1,-0x38(%rbp)
  cmpl   $0x0,-0x34(%rbp)
  je     L95
  mov    -0x48(%rbp),%rax
  sub    -0x50(%rbp),%rax
  sar    $0x2,%rax
  neg    %rax
  mov    %eax,%edx
  mov    -0x34(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x34(%rbp)
  jmp    L395
L95:
  nop
  jmp    L79
L146:
  nop
L79:
  mov    -0x40(%rbp),%rdx
  lea    0x4(%rdx),%rax
  mov    %rax,-0x40(%rbp)
  mov    -0x48(%rbp),%rax
  lea    0x4(%rax),%rcx
  mov    %rcx,-0x48(%rbp)
  mov    (%rdx),%edx
  mov    %edx,(%rax)
  subl   $0x1,-0x54(%rbp)
L395:
  movl   $0xffffffff,-0x2c(%rbp)
L375:
  cmpl   $0x0,-0x54(%rbp)
  js     L86
  mov    -0x28(%rbp),%eax
  and    $0x7fffffff,%eax
  test   %eax,%eax
  je     L168
  mov    -0x28(%rbp),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x28(%rbp),%eax
  add    %eax,%eax
  jmp    L190
L168:
  addq   $0x10,-0x40(%rbp)
  mov    -0x40(%rbp),%rax
  mov    -0x10(%rax),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x24(%rbp),%eax
  add    %eax,%eax
  add    $0x1,%eax
L190:
  mov    %eax,-0x28(%rbp)
  cmpl   $0x0,-0x24(%rbp)
  jns    L146
  cmpl   $0x0,-0x2c(%rbp)
  jns    L220
  movl   $0x1,-0x2c(%rbp)
  mov    -0x28(%rbp),%eax
  and    $0x7fffffff,%eax
  test   %eax,%eax
  je     L67
  mov    -0x28(%rbp),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x28(%rbp),%eax
  add    %eax,%eax
  jmp    L254
L67:
  addq   $0x10,-0x40(%rbp)
  mov    -0x40(%rbp),%rax
  mov    -0x10(%rax),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x24(%rbp),%eax
  add    %eax,%eax
  add    $0x1,%eax
L254:
  mov    %eax,-0x28(%rbp)
  cmpl   $0x0,-0x24(%rbp)
  jns    L337
L220:
  movl   $0x2,-0x2c(%rbp)
  mov    -0x48(%rbp),%rax
  sub    -0x50(%rbp),%rax
  sar    $0x2,%rax
  mov    %eax,%edx
  mov    -0x34(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x20(%rbp)
  movl   $0x0,-0x30(%rbp)
  movq   $0x0,-0x10(%rbp)
  movl   $0x100,-0x1c(%rbp)
  movl   $0x0,-0x18(%rbp)
  cmpl   $0x61a80,-0x20(%rbp)
  jg     L255
  mov    $0x3c,%eax
  jmp    L72
L255:
  mov    $0x32,%eax
L72:
  mov    %eax,-0x18(%rbp)
  mov    -0x40(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x40(%rbp)
  mov    (%rax),%eax
  cltq
  mov    %rax,-0x10(%rbp)
L218:
  shll   -0x1c(%rbp)
  mov    -0x20(%rbp),%edx
  mov    -0x18(%rbp),%eax
  add    %edx,%eax
  cmp    %eax,-0x1c(%rbp)
  jge    L174
  mov    -0x1c(%rbp),%eax
  and    $0x5ffc00,%eax
  test   %eax,%eax
  je     L398
  mov    -0x18(%rbp),%edx
  mov    %edx,%eax
  shl    $0x3,%eax
  add    %edx,%eax
  sar    $0x3,%eax
  mov    %eax,-0x18(%rbp)
L398:
  mov    -0x18(%rbp),%eax
  cltq
  cmp    %rax,-0x10(%rbp)
  jl     L135
  mov    -0x18(%rbp),%eax
  sub    %eax,-0x30(%rbp)
  mov    -0x18(%rbp),%eax
  add    %eax,-0x20(%rbp)
  shll   -0x18(%rbp)
  mov    -0x28(%rbp),%eax
  and    $0x7fffffff,%eax
  test   %eax,%eax
  je     L251
  mov    -0x28(%rbp),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x28(%rbp),%eax
  add    %eax,%eax
  jmp    L406
L251:
  addq   $0x10,-0x40(%rbp)
  mov    -0x40(%rbp),%rax
  mov    -0x10(%rax),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x24(%rbp),%eax
  add    %eax,%eax
  add    $0x1,%eax
L406:
  mov    %eax,-0x28(%rbp)
  mov    -0x24(%rbp),%eax
  sar    $0x1f,%eax
  movslq %eax,%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  add    %rax,-0x10(%rbp)
  jmp    L218
L174:
  nop
  mov    -0x20(%rbp),%eax
  sub    %eax,-0x1c(%rbp)
  mov    -0x1c(%rbp),%eax
  cltq
  cmp    %rax,-0x10(%rbp)
  jl     L336
  mov    -0x28(%rbp),%eax
  and    $0x7fffffff,%eax
  test   %eax,%eax
  je     L191
  mov    -0x28(%rbp),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x28(%rbp),%eax
  add    %eax,%eax
  jmp    L357
L191:
  addq   $0x10,-0x40(%rbp)
  mov    -0x40(%rbp),%rax
  mov    -0x10(%rax),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x24(%rbp),%eax
  add    %eax,%eax
  add    $0x1,%eax
L357:
  mov    %eax,-0x28(%rbp)
  mov    -0x24(%rbp),%eax
  sar    $0x1f,%eax
  movslq %eax,%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  add    %rax,-0x10(%rbp)
  mov    -0x1c(%rbp),%eax
  cltq
  sub    %rax,-0x10(%rbp)
  jmp    L228
L135:
  nop
  jmp    L228
L336:
  nop
L228:
  mov    -0x10(%rbp),%rax
  mov    %eax,%edx
  mov    -0x30(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x30(%rbp)
  addl   $0x1,-0x30(%rbp)
  cmpl   $0x1517,-0x30(%rbp)
  jle    L90
  addl   $0x1,-0x2c(%rbp)
L90:
  cmpl   $0x5ffff,-0x30(%rbp)
  jle    L304
  addl   $0x1,-0x2c(%rbp)
L304:
  negl   -0x30(%rbp)
  jmp    L278
L337:
  nop
L278:
  movq   $0x0,-0x8(%rbp)
  mov    -0x28(%rbp),%eax
  and    $0x7fffffff,%eax
  test   %eax,%eax
  je     L45
  mov    -0x28(%rbp),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x28(%rbp),%eax
  add    %eax,%eax
  jmp    L308
L45:
  addq   $0x10,-0x40(%rbp)
  mov    -0x40(%rbp),%rax
  mov    -0x10(%rax),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x24(%rbp),%eax
  add    %eax,%eax
  add    $0x1,%eax
L308:
  mov    %eax,-0x28(%rbp)
  cmpl   $0x0,-0x24(%rbp)
  js     L382
  mov    -0x28(%rbp),%eax
  and    $0x7fffffff,%eax
  test   %eax,%eax
  je     L240
  mov    -0x28(%rbp),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x28(%rbp),%eax
  add    %eax,%eax
  jmp    L27
L240:
  addq   $0x10,-0x40(%rbp)
  mov    -0x40(%rbp),%rax
  mov    -0x10(%rax),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x24(%rbp),%eax
  add    %eax,%eax
  add    $0x1,%eax
L27:
  mov    %eax,-0x28(%rbp)
  mov    -0x24(%rbp),%eax
  sar    $0x1f,%eax
  add    %eax,-0x2c(%rbp)
  jmp    L397
L382:
  addl   $0x2,-0x2c(%rbp)
L360:
  mov    -0x28(%rbp),%eax
  and    $0x7fffffff,%eax
  test   %eax,%eax
  je     L181
  mov    -0x28(%rbp),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x28(%rbp),%eax
  add    %eax,%eax
  jmp    L400
L181:
  addq   $0x10,-0x40(%rbp)
  mov    -0x40(%rbp),%rax
  mov    -0x10(%rax),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x24(%rbp),%eax
  add    %eax,%eax
  add    $0x1,%eax
L400:
  mov    %eax,-0x28(%rbp)
  mov    -0x24(%rbp),%eax
  sar    $0x1f,%eax
  movslq %eax,%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  add    %rax,-0x8(%rbp)
  mov    -0x28(%rbp),%eax
  and    $0x7fffffff,%eax
  test   %eax,%eax
  je     L199
  mov    -0x28(%rbp),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x28(%rbp),%eax
  add    %eax,%eax
  jmp    L17
L199:
  addq   $0x10,-0x40(%rbp)
  mov    -0x40(%rbp),%rax
  mov    -0x10(%rax),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x24(%rbp),%eax
  add    %eax,%eax
  add    $0x1,%eax
L17:
  mov    %eax,-0x28(%rbp)
  cmpl   $0x0,-0x24(%rbp)
  jns    L378
  addq   $0x1,-0x8(%rbp)
  jmp    L360
L378:
  nop
  mov    -0x8(%rbp),%rax
  mov    %eax,%edx
  mov    -0x2c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x2c(%rbp)
L397:
  mov    -0x2c(%rbp),%eax
  sub    %eax,-0x54(%rbp)
  mov    -0x48(%rbp),%rax
  sub    -0x50(%rbp),%rax
  sar    $0x2,%rax
  mov    %eax,%edx
  mov    -0x30(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x14(%rbp)
L307:
  mov    -0x14(%rbp),%eax
  and    -0x38(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x48(%rbp),%rax
  mov    %edx,(%rax)
  addl   $0x1,-0x14(%rbp)
  addq   $0x4,-0x48(%rbp)
  subl   $0x1,-0x2c(%rbp)
  cmpl   $0x0,-0x2c(%rbp)
  jne    L307
  jmp    L375
L86:
  nop
  pop    %rbp
  ret
```

assistant: ```c
void unpack_c(int current_history_size, int history_size, uint8_t *src, uint8_t *dst, uint8_t *start, int left) {
  int ofs = -1;
  int len;
  uint32_t bits = 0x80000000;
  uint32_t resbits;
  left--;
  history_size--;
  if (current_history_size) {
    current_history_size -= dst - start;
    goto nextblock;
  }
copyletter:
  *dst++ = *src++;
  left--;
nextblock:
  len = -1;
get_bit:
  if (left < 0)
    return;
  if (((bits = bits & 0x7fffffff ? (resbits = bits, bits + bits) : (src += 4, resbits = *((uint32_t *)(src - 4)), (resbits << 1) + 1)), resbits >> 31) == 0)
    goto copyletter;
  if (len < 0) {
    len = 1;
    if (!((bits = bits & 0x7fffffff ? (resbits = bits, bits + bits) : (src += 4, resbits = *((uint32_t *)(src - 4)), (resbits << 1) + 1)), resbits >> 31)) {
      goto uselastofs;
    }
  }
  len = 2;
  {
    int total = (dst - start + current_history_size);
    ofs = 0;
    long int res = 0;
    int x = 256;
    int top = 0;
    top = ((total <= 400000) ? 60 : 50);
    res = *src++;
    while (1) {
      x += x;
      if (x >= total + top)
        break;
      if (x & 0x002FFe00 * 2)
        top = ((9 * top) >> 3);
      if (res < top) {
        goto getcode_doneit;
      }
      ofs -= top;
      total += top;
      top += top;
      res += res + ((bits = bits & 0x7fffffff ? (resbits = bits, bits + bits) : (src += 4, resbits = *((uint32_t *)(src - 4)), (resbits << 1) + 1)), resbits >> 31);
    }
    x -= total;
    if (res >= x) {
      res += res + ((bits = bits & 0x7fffffff ? (resbits = bits, bits + bits) : (src += 4, resbits = *((uint32_t *)(src - 4)), (resbits << 1) + 1)), resbits >> 31);
      res -= x;
    }
  getcode_doneit:
    ofs += res;
  };
  ofs++;
  if (ofs >= 5400)
    len++;
  if (ofs >= 0x060000)
    len++;
  ofs = -ofs;
uselastofs : {
  long int res = 0;
  if (((bits = bits & 0x7fffffff ? (resbits = bits, bits + bits) : (src += 4, resbits = *((uint32_t *)(src - 4)), (resbits << 1) + 1)), resbits >> 31) == 0) {
    len += ((bits = bits & 0x7fffffff ? (resbits = bits, bits + bits) : (src += 4, resbits = *((uint32_t *)(src - 4)), (resbits << 1) + 1)), resbits >> 31);
    goto getlen_0bit;
  }
  len += 2;
  while (1) {
    res += res + ((bits = bits & 0x7fffffff ? (resbits = bits, bits + bits) : (src += 4, resbits = *((uint32_t *)(src - 4)), (resbits << 1) + 1)), resbits >> 31);
    if (((bits = bits & 0x7fffffff ? (resbits = bits, bits + bits) : (src += 4, resbits = *((uint32_t *)(src - 4)), (resbits << 1) + 1)), resbits >> 31) == 0)
      break;
    res++;
  }
  len += res;
getlen_0bit:;
};
  left -= len;
  int ptr = dst - start + ofs;
  do {
    *dst = start[ptr & (history_size)];
    ptr++;
    dst++;
  } while (--len);
  goto get_bit;
}
```