user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<unlzss>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %esi,-0x3c(%rbp)
  mov    %edx,-0x40(%rbp)
  mov    -0x40(%rbp),%eax
  add    $0x14,%eax
  mov    %eax,-0x28(%rbp)
  mov    -0x40(%rbp),%eax
  mov    %eax,%edi
  call   <get_word@plt>
  mov    %eax,-0x10(%rbp)
  addl   $0x3,-0x40(%rbp)
  mov    -0x40(%rbp),%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x28(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x28(%rbp)
  mov    %eax,%edi
  call   <get_byte@plt>
  mov    %rax,%rcx
  mov    -0x38(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
L263:
  mov    -0x3c(%rbp),%eax
  mov    %eax,%edi
  call   <get_long@plt>
  mov    %eax,-0x24(%rbp)
  addl   $0x4,-0x3c(%rbp)
  movl   $0x1f,-0x20(%rbp)
  jmp    L205
L173:
  nop
  mov    -0x28(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x28(%rbp)
  mov    %eax,%edi
  call   <get_byte@plt>
  mov    %rax,%rcx
  mov    -0x38(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
L367:
  subl   $0x1,-0x20(%rbp)
  cmpl   $0x0,-0x20(%rbp)
  jns    L66
  jmp    L263
L66:
  nop
L205:
  mov    -0x20(%rbp),%eax
  mov    -0x24(%rbp),%edx
  mov    %eax,%ecx
  sar    %cl,%edx
  mov    %edx,%eax
  and    $0x1,%eax
  test   %eax,%eax
  jne    L173
  subl   $0x1,-0x20(%rbp)
  cmpl   $0x0,-0x20(%rbp)
  js     L89
  nop
L283:
  mov    -0x20(%rbp),%eax
  mov    -0x24(%rbp),%edx
  mov    %eax,%ecx
  sar    %cl,%edx
  mov    %edx,%eax
  and    $0x1,%eax
  test   %eax,%eax
  jne    L18
  subl   $0x1,-0x20(%rbp)
  cmpl   $0x0,-0x20(%rbp)
  js     L131
  nop
L323:
  mov    -0x28(%rbp),%eax
  mov    %eax,%edi
  call   <get_byte@plt>
  mov    %eax,-0x18(%rbp)
  addl   $0x1,-0x28(%rbp)
  mov    -0x20(%rbp),%eax
  mov    -0x24(%rbp),%edx
  mov    %eax,%ecx
  sar    %cl,%edx
  mov    %edx,%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L219
  orl    $0x100,-0x18(%rbp)
  jmp    L326
L89:
  nop
  mov    -0x3c(%rbp),%eax
  mov    %eax,%edi
  call   <get_long@plt>
  mov    %eax,-0x24(%rbp)
  addl   $0x4,-0x3c(%rbp)
  movl   $0x1f,-0x20(%rbp)
  jmp    L283
L131:
  nop
  mov    -0x3c(%rbp),%eax
  mov    %eax,%edi
  call   <get_long@plt>
  mov    %eax,-0x24(%rbp)
  addl   $0x4,-0x3c(%rbp)
  movl   $0x1f,-0x20(%rbp)
  jmp    L323
L18:
  nop
  subl   $0x1,-0x20(%rbp)
  cmpl   $0x0,-0x20(%rbp)
  js     L4
  nop
L366:
  movl   $0x0,-0x1c(%rbp)
  movl   $0x1,-0x14(%rbp)
L179:
  mov    -0x20(%rbp),%eax
  mov    -0x24(%rbp),%edx
  mov    %eax,%ecx
  sar    %cl,%edx
  mov    %edx,%eax
  and    $0x1,%eax
  test   %eax,%eax
  jne    L12
  subl   $0x1,-0x20(%rbp)
  cmpl   $0x0,-0x20(%rbp)
  js     L86
  nop
L61:
  mov    -0x20(%rbp),%eax
  mov    -0x24(%rbp),%edx
  mov    %eax,%ecx
  sar    %cl,%edx
  mov    %edx,%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L128
  mov    -0x14(%rbp),%eax
  add    %eax,-0x1c(%rbp)
  jmp    L54
L128:
  nop
L54:
  shll   -0x14(%rbp)
  subl   $0x1,-0x20(%rbp)
  cmpl   $0x0,-0x20(%rbp)
  js     L212
  jmp    L179
L212:
  mov    -0x3c(%rbp),%eax
  mov    %eax,%edi
  call   <get_long@plt>
  mov    %eax,-0x24(%rbp)
  addl   $0x4,-0x3c(%rbp)
  movl   $0x1f,-0x20(%rbp)
  jmp    L179
L86:
  nop
  mov    -0x3c(%rbp),%eax
  mov    %eax,%edi
  call   <get_long@plt>
  mov    %eax,-0x24(%rbp)
  addl   $0x4,-0x3c(%rbp)
  movl   $0x1f,-0x20(%rbp)
  jmp    L61
L4:
  nop
  mov    -0x3c(%rbp),%eax
  mov    %eax,%edi
  call   <get_long@plt>
  mov    %eax,-0x24(%rbp)
  addl   $0x4,-0x3c(%rbp)
  movl   $0x1f,-0x20(%rbp)
  jmp    L366
L12:
  nop
  mov    -0x14(%rbp),%eax
  add    %eax,-0x1c(%rbp)
  cmpl   $0x10,-0x1c(%rbp)
  je     L3
  mov    -0xc(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,%edi
  call   <get_byte@plt>
  mov    %eax,-0x18(%rbp)
  mov    -0x1c(%rbp),%eax
  mov    -0x10(%rbp),%edx
  mov    %eax,%ecx
  sar    %cl,%edx
  mov    %edx,%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L206
  orl    $0x100,-0x18(%rbp)
  jmp    L326
L219:
  nop
  jmp    L326
L206:
  nop
L326:
  subl   $0x1,-0x20(%rbp)
  cmpl   $0x0,-0x20(%rbp)
  js     L274
  nop
L116:
  movl   $0x0,-0x1c(%rbp)
  movl   $0x1,-0x14(%rbp)
L165:
  mov    -0x20(%rbp),%eax
  mov    -0x24(%rbp),%edx
  mov    %eax,%ecx
  sar    %cl,%edx
  mov    %edx,%eax
  and    $0x1,%eax
  test   %eax,%eax
  jne    L268
  subl   $0x1,-0x20(%rbp)
  cmpl   $0x0,-0x20(%rbp)
  js     L62
  nop
L195:
  mov    -0x20(%rbp),%eax
  mov    -0x24(%rbp),%edx
  mov    %eax,%ecx
  sar    %cl,%edx
  mov    %edx,%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L344
  mov    -0x14(%rbp),%eax
  add    %eax,-0x1c(%rbp)
L344:
  shll   -0x14(%rbp)
  subl   $0x1,-0x20(%rbp)
  cmpl   $0x0,-0x20(%rbp)
  js     L43
  jmp    L165
L43:
  mov    -0x3c(%rbp),%eax
  mov    %eax,%edi
  call   <get_long@plt>
  mov    %eax,-0x24(%rbp)
  addl   $0x4,-0x3c(%rbp)
  movl   $0x1f,-0x20(%rbp)
  jmp    L165
L62:
  nop
  mov    -0x3c(%rbp),%eax
  mov    %eax,%edi
  call   <get_long@plt>
  mov    %eax,-0x24(%rbp)
  addl   $0x4,-0x3c(%rbp)
  movl   $0x1f,-0x20(%rbp)
  jmp    L195
L274:
  nop
  mov    -0x3c(%rbp),%eax
  mov    %eax,%edi
  call   <get_long@plt>
  mov    %eax,-0x24(%rbp)
  addl   $0x4,-0x3c(%rbp)
  movl   $0x1f,-0x20(%rbp)
  jmp    L116
L268:
  nop
  mov    -0x1c(%rbp),%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  add    $0x1,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x18(%rbp),%eax
  cltq
  neg    %rax
  mov    %rax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x8(%rbp)
  jmp    L234
L291:
  mov    -0x8(%rbp),%rdx
  lea    0x1(%rdx),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x38(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    %rcx,-0x38(%rbp)
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
  subl   $0x1,-0x1c(%rbp)
L234:
  cmpl   $0x0,-0x1c(%rbp)
  jns    L291
  jmp    L367
L3:
  nop
  mov    $0x0,%eax
  leave
  ret
```

assistant: ```c
int unlzss(unsigned char *out, int a2, int a3) {
  int a1;
  int d0, d1, d2, d3, d4, d6;
  int common_distances;
  unsigned char *copy_from;
  a1 = a3 + 20;
  d4 = get_word(a3);
  a3 = a3 + 3;
  common_distances = a3;
  *out++ = get_byte(a1++);
loc_cf6e:
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cf7a;
loc_cf74:
  *out++ = get_byte(a1++);
loc_cf76:
  d1--;
  if (d1 < 0) {
    goto loc_cf6e;
  }
loc_cf7a:
  if (d0 & (1 << d1)) {
    goto loc_cf74;
  }
  d1--;
  if (d1 < 0) {
    goto loc_cf98;
  }
loc_cf82:
  if (d0 & (1 << d1)) {
    goto loc_cfa4;
  }
  d1--;
  if (d1 < 0) {
    goto loc_cf9e;
  }
loc_cf8a:
  d3 = get_byte(a1);
  a1++;
  if ((d0 & (1 << d1)) == 0) {
    goto loc_cfe6;
  }
  d3 = d3 | 0x100;
  goto loc_cfe6;
loc_cf98:
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cf82;
loc_cf9e:
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cf8a;
loc_cfa4:
  d1--;
  if (d1 < 0) {
    goto loc_cfcc;
  }
loc_cfa8:
  d2 = 0;
  d6 = 1;
loc_cfac:
  if (d0 & (1 << d1)) {
    goto loc_cfd2;
  }
  d1--;
  if (d1 < 0) {
    goto loc_cfc6;
  }
loc_cfb4:
  if ((d0 & (1 << d1)) == 0) {
    goto loc_cfba;
  }
  d2 = d2 + d6;
loc_cfba:
  d6 = d6 << 1;
  d1--;
  if (d1 >= 0) {
    goto loc_cfac;
  }
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cfac;
loc_cfc6:
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cfb4;
loc_cfcc:
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cfa8;
loc_cfd2:
  d2 = d2 + d6;
  if (d2 == 16) {
    goto loc_d026;
  }
  d3 = get_byte(common_distances + d2);
  if (d4 & (1 << d2)) {
    d3 = d3 | 0x100;
  }
loc_cfe6:
  d1--;
  if (d1 < 0) {
    goto loc_d00e;
  }
loc_cfea:
  d2 = 0;
  d6 = 1;
loc_cfee:
  if (d0 & (1 << d1)) {
    goto loc_d014;
  }
  d1 = d1 - 1;
  if (d1 < 0) {
    goto loc_d008;
  }
loc_cff6:
  if ((d0 & (1 << d1))) {
    d2 = d2 + d6;
  }
  d6 = d6 << 1;
  d1--;
  if (d1 >= 0) {
    goto loc_cfee;
  }
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cfee;
loc_d008:
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cff6;
loc_d00e:
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cfea;
loc_d014:
  d2 = d2 + d6 + 1;
  copy_from = out - d3;
  while (d2 >= 0) {
    *out++ = *copy_from++;
    d2--;
  }
  goto loc_cf76;
loc_d026:
  return 0;
}
```