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

```asm
<mmini_lzl_decompress>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %rdx,-0x48(%rbp)
  mov    %rcx,-0x50(%rbp)
  movq   $0x0,-0x28(%rbp)
  movq   $0x0,-0x20(%rbp)
  jmp    L131
L81:
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x3,%al
  ja     L63
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  mov    %al,-0x29(%rbp)
  addq   $0x1,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  cmp    -0x40(%rbp),%rax
  jb     L52
  mov    $0x0,%eax
  jmp    L139
L52:
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x3,%al
  ja     L91
  mov    -0x28(%rbp),%rax
  cmp    -0x50(%rbp),%rax
  jb     L86
  mov    $0x0,%eax
  jmp    L139
L86:
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  mov    -0x48(%rbp),%rdx
  add    %rax,%rdx
  movzbl (%rcx),%eax
  mov    %al,(%rdx)
  jmp    L135
L91:
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %rax,-0x10(%rbp)
  addq   $0x1,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  cmp    -0x40(%rbp),%rax
  jb     L109
  mov    $0x0,%eax
  jmp    L139
L109:
  mov    -0x10(%rbp),%rax
  shl    $0x8,%rax
  and    $0x700,%eax
  mov    %rax,%rcx
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %rax,%rcx
  mov    %rcx,%rdx
  mov    -0x28(%rbp),%rax
  sub    %rdx,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x10(%rbp),%rax
  shr    %rax
  and    $0x7c,%eax
  mov    %rax,%rdx
  movzbl -0x29(%rbp),%eax
  or     %rdx,%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x28(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  cmp    %rax,-0x50(%rbp)
  jae    L69
  mov    $0x0,%eax
  jmp    L139
L69:
  mov    -0x18(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x8(%rbp)
  jmp    L166
L90:
  mov    -0x48(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  mov    -0x48(%rbp),%rdx
  add    %rax,%rdx
  movzbl (%rcx),%eax
  mov    %al,(%rdx)
  addq   $0x1,-0x18(%rbp)
L166:
  mov    -0x18(%rbp),%rax
  cmp    -0x8(%rbp),%rax
  jb     L90
  jmp    L135
L63:
  mov    -0x28(%rbp),%rax
  cmp    -0x50(%rbp),%rax
  jb     L117
  mov    $0x0,%eax
  jmp    L139
L117:
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  mov    -0x48(%rbp),%rdx
  add    %rax,%rdx
  movzbl (%rcx),%eax
  mov    %al,(%rdx)
L135:
  addq   $0x1,-0x20(%rbp)
L131:
  mov    -0x20(%rbp),%rax
  cmp    -0x40(%rbp),%rax
  jb     L81
  mov    -0x28(%rbp),%rax
L139:
  pop    %rbp
  ret
```

assistant: ```c
unsigned long mmini_lzl_decompress(const unsigned char *in, unsigned long inlen, unsigned char *out, unsigned long outlen) {
  unsigned long outptr, i, start, len, end;
  unsigned char tmp;
  outptr = 0;
  i = 0;
  while (i < inlen) {
    if (in[i] <= 0x03) {
      tmp = in[i];
      if (++i >= inlen)
        return 0;
      if (in[i] <= 0x03) {
        if (outptr >= outlen)
          return 0;
        out[outptr++] = in[i];
      } else {
        len = (unsigned long)in[i];
        if (++i >= inlen)
          return 0;
        start = outptr - (((len & 0x07) << 8) | (unsigned long)in[i]);
        len = ((len >> 1) & 0x7c) | (unsigned long)tmp;
        if ((outptr + len) > outlen)
          return 0;
        for (end = start + len; start < end; ++start)
          out[outptr++] = out[start];
      }
    } else {
      if (outptr >= outlen)
        return 0;
      out[outptr++] = in[i];
    }
    ++i;
  }
  return outptr;
}
```