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

```asm
<compress>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  add    $0xffffffffffffff80,%rsp
  mov    %rdi,-0x68(%rbp)
  mov    %rsi,-0x70(%rbp)
  mov    %rdx,-0x78(%rbp)
  mov    %rcx,-0x80(%rbp)
  movq   $0x0,-0x20(%rbp)
  movq   $0x0,-0x30(%rbp)
  mov    -0x20(%rbp),%rax
  cmp    -0x70(%rbp),%rax
  jb     L136
  lea    D143(%rip),%rax
  mov    %rax,%rdi
  call   <error@plt>
L136:
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  mov    -0x68(%rbp),%rdx
  add    %rdx,%rax
  movb   $0x54,(%rax)
  mov    -0x20(%rbp),%rax
  cmp    -0x70(%rbp),%rax
  jb     L231
  lea    D143(%rip),%rax
  mov    %rax,%rdi
  call   <error@plt>
L231:
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  mov    -0x68(%rbp),%rdx
  add    %rdx,%rax
  movb   $0x49,(%rax)
  mov    -0x20(%rbp),%rax
  cmp    -0x70(%rbp),%rax
  jb     L123
  lea    D143(%rip),%rax
  mov    %rax,%rdi
  call   <error@plt>
L123:
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  mov    -0x68(%rbp),%rdx
  add    %rdx,%rax
  movb   $0x4e,(%rax)
  mov    -0x20(%rbp),%rax
  cmp    -0x70(%rbp),%rax
  jb     L307
  lea    D143(%rip),%rax
  mov    %rax,%rdi
  call   <error@plt>
L307:
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  mov    -0x68(%rbp),%rdx
  add    %rdx,%rax
  movb   $0x59,(%rax)
  jmp    L368
L147:
  movq   $0x0,-0x28(%rbp)
  movq   $0x0,-0x58(%rbp)
  movq   $0x0,-0x50(%rbp)
  jmp    L18
L289:
  movq   $0x0,-0x48(%rbp)
L333:
  mov    -0x50(%rbp),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  cmp    %rax,-0x80(%rbp)
  jbe    L23
  mov    -0x50(%rbp),%rdx
  mov    -0x48(%rbp),%rax
  add    %rax,%rdx
  mov    -0x78(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x30(%rbp),%rcx
  mov    -0x48(%rbp),%rax
  add    %rax,%rcx
  mov    -0x78(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jne    L334
  addq   $0x1,-0x48(%rbp)
  jmp    L333
L23:
  nop
  jmp    L170
L334:
  nop
L170:
  mov    -0x48(%rbp),%rax
  cmp    -0x28(%rbp),%rax
  jbe    L296
  mov    -0x48(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x50(%rbp),%rax
  mov    %rax,-0x58(%rbp)
L296:
  addq   $0x1,-0x50(%rbp)
L18:
  mov    -0x50(%rbp),%rax
  cmp    -0x30(%rbp),%rax
  jb     L289
  cmpq   $0x3,-0x28(%rbp)
  jbe    L275
  mov    -0x30(%rbp),%rax
  sub    -0x58(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x28(%rbp),%rax
  add    %rax,-0x30(%rbp)
  mov    -0x20(%rbp),%rax
  cmp    -0x70(%rbp),%rax
  jb     L168
  lea    D143(%rip),%rax
  mov    %rax,%rdi
  call   <error@plt>
L168:
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  mov    -0x68(%rbp),%rdx
  add    %rdx,%rax
  movb   $0xff,(%rax)
  mov    -0x8(%rbp),%rax
  mov    %rax,-0x40(%rbp)
L364:
  cmpq   $0x7f,-0x40(%rbp)
  jbe    L238
  mov    -0x20(%rbp),%rax
  cmp    -0x70(%rbp),%rax
  jb     L55
  lea    D143(%rip),%rax
  mov    %rax,%rdi
  call   <error@plt>
L55:
  mov    -0x40(%rbp),%rax
  or     $0xffffff80,%eax
  mov    %eax,%ecx
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  mov    -0x68(%rbp),%rdx
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
  jmp    L251
L238:
  mov    -0x20(%rbp),%rax
  cmp    -0x70(%rbp),%rax
  jb     L90
  lea    D143(%rip),%rax
  mov    %rax,%rdi
  call   <error@plt>
L90:
  mov    -0x40(%rbp),%rax
  mov    %eax,%ecx
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  mov    -0x68(%rbp),%rdx
  add    %rdx,%rax
  and    $0x7f,%ecx
  mov    %ecx,%edx
  mov    %dl,(%rax)
L251:
  shrq   $0x7,-0x40(%rbp)
  cmpq   $0x0,-0x40(%rbp)
  jne    L364
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x38(%rbp)
L64:
  cmpq   $0x7f,-0x38(%rbp)
  jbe    L320
  mov    -0x20(%rbp),%rax
  cmp    -0x70(%rbp),%rax
  jb     L369
  lea    D143(%rip),%rax
  mov    %rax,%rdi
  call   <error@plt>
L369:
  mov    -0x38(%rbp),%rax
  or     $0xffffff80,%eax
  mov    %eax,%ecx
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  mov    -0x68(%rbp),%rdx
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
  jmp    L87
L320:
  mov    -0x20(%rbp),%rax
  cmp    -0x70(%rbp),%rax
  jb     L215
  lea    D143(%rip),%rax
  mov    %rax,%rdi
  call   <error@plt>
L215:
  mov    -0x38(%rbp),%rax
  mov    %eax,%ecx
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  mov    -0x68(%rbp),%rdx
  add    %rdx,%rax
  and    $0x7f,%ecx
  mov    %ecx,%edx
  mov    %dl,(%rax)
L87:
  shrq   $0x7,-0x38(%rbp)
  cmpq   $0x0,-0x38(%rbp)
  jne    L64
  jmp    L368
L275:
  mov    -0x20(%rbp),%rax
  cmp    -0x70(%rbp),%rax
  jb     L224
  lea    D143(%rip),%rax
  mov    %rax,%rdi
  call   <error@plt>
L224:
  mov    -0x78(%rbp),%rdx
  mov    -0x30(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  mov    -0x68(%rbp),%rdx
  add    %rax,%rdx
  movzbl (%rcx),%eax
  mov    %al,(%rdx)
  addq   $0x1,-0x30(%rbp)
L368:
  mov    -0x30(%rbp),%rax
  cmp    -0x80(%rbp),%rax
  jb     L147
  mov    -0x20(%rbp),%rax
  cmp    -0x70(%rbp),%rax
  jb     L2
  lea    D143(%rip),%rax
  mov    %rax,%rdi
  call   <error@plt>
L2:
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  mov    -0x68(%rbp),%rdx
  add    %rdx,%rax
  movb   $0xff,(%rax)
  movq   $0x0,-0x18(%rbp)
L68:
  cmpq   $0x7f,-0x18(%rbp)
  jbe    L191
  mov    -0x20(%rbp),%rax
  cmp    -0x70(%rbp),%rax
  jb     L190
  lea    D143(%rip),%rax
  mov    %rax,%rdi
  call   <error@plt>
L190:
  mov    -0x18(%rbp),%rax
  or     $0xffffff80,%eax
  mov    %eax,%ecx
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  mov    -0x68(%rbp),%rdx
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
  jmp    L126
L191:
  mov    -0x20(%rbp),%rax
  cmp    -0x70(%rbp),%rax
  jb     L314
  lea    D143(%rip),%rax
  mov    %rax,%rdi
  call   <error@plt>
L314:
  mov    -0x18(%rbp),%rax
  mov    %eax,%ecx
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  mov    -0x68(%rbp),%rdx
  add    %rdx,%rax
  and    $0x7f,%ecx
  mov    %ecx,%edx
  mov    %dl,(%rax)
L126:
  shrq   $0x7,-0x18(%rbp)
  cmpq   $0x0,-0x18(%rbp)
  jne    L68
  movq   $0x0,-0x10(%rbp)
L177:
  cmpq   $0x7f,-0x10(%rbp)
  jbe    L104
  mov    -0x20(%rbp),%rax
  cmp    -0x70(%rbp),%rax
  jb     L92
  lea    D143(%rip),%rax
  mov    %rax,%rdi
  call   <error@plt>
L92:
  mov    -0x10(%rbp),%rax
  or     $0xffffff80,%eax
  mov    %eax,%ecx
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  mov    -0x68(%rbp),%rdx
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
  jmp    L166
L104:
  mov    -0x20(%rbp),%rax
  cmp    -0x70(%rbp),%rax
  jb     L278
  lea    D143(%rip),%rax
  mov    %rax,%rdi
  call   <error@plt>
L278:
  mov    -0x10(%rbp),%rax
  mov    %eax,%ecx
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  mov    -0x68(%rbp),%rdx
  add    %rdx,%rax
  and    $0x7f,%ecx
  mov    %ecx,%edx
  mov    %dl,(%rax)
L166:
  shrq   $0x7,-0x10(%rbp)
  cmpq   $0x0,-0x10(%rbp)
  jne    L177
  mov    -0x20(%rbp),%rax
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: label: D143
datatype: string

tool: D143: destination overflow

assistant: ```c
size_t compress(char *dst, size_t dst_sz, char *src, size_t src_sz) {
  size_t dst_pos = 0;
  size_t src_pos = 0;
  do {
    if (dst_pos >= dst_sz) {
      error("destination overflow");
    }
    dst[dst_pos++] = ('T');
  } while (0);
  do {
    if (dst_pos >= dst_sz) {
      error("destination overflow");
    }
    dst[dst_pos++] = ('I');
  } while (0);
  do {
    if (dst_pos >= dst_sz) {
      error("destination overflow");
    }
    dst[dst_pos++] = ('N');
  } while (0);
  do {
    if (dst_pos >= dst_sz) {
      error("destination overflow");
    }
    dst[dst_pos++] = ('Y');
  } while (0);
  while (src_pos < src_sz) {
    size_t best_len = 0;
    size_t best_start = 0;
    for (size_t start = 0; start < src_pos; start++) {
      size_t len = 0;
      while (1) {
        if (start + len >= src_sz)
          break;
        if (src[start + len] != src[src_pos + len])
          break;
        len++;
      }
      if (len > best_len) {
        best_len = len;
        best_start = start;
      }
    }
    if (best_len > 3) {
      size_t delta = src_pos - best_start;
      src_pos += best_len;
      do {
        if (dst_pos >= dst_sz) {
          error("destination overflow");
        }
        dst[dst_pos++] = (0xff);
      } while (0);
      do {
        size_t tmp = (delta);
        do {
          if (tmp >= 128) {
            do {
              if (dst_pos >= dst_sz) {
                error("destination overflow");
              }
              dst[dst_pos++] = (128 | (tmp & 0x7f));
            } while (0);
          } else {
            do {
              if (dst_pos >= dst_sz) {
                error("destination overflow");
              }
              dst[dst_pos++] = (tmp & 0x7f);
            } while (0);
          }
          tmp >>= 7;
        } while (tmp > 0);
      } while (0);
      do {
        size_t tmp = (best_len);
        do {
          if (tmp >= 128) {
            do {
              if (dst_pos >= dst_sz) {
                error("destination overflow");
              }
              dst[dst_pos++] = (128 | (tmp & 0x7f));
            } while (0);
          } else {
            do {
              if (dst_pos >= dst_sz) {
                error("destination overflow");
              }
              dst[dst_pos++] = (tmp & 0x7f);
            } while (0);
          }
          tmp >>= 7;
        } while (tmp > 0);
      } while (0);
    } else {
      do {
        if (dst_pos >= dst_sz) {
          error("destination overflow");
        }
        dst[dst_pos++] = (src[src_pos]);
      } while (0);
      if (src[src_pos] == 0xff) {
        do {
          size_t tmp = (0);
          do {
            if (tmp >= 128) {
              do {
                if (dst_pos >= dst_sz) {
                  error("destination overflow");
                }
                dst[dst_pos++] = (128 | (tmp & 0x7f));
              } while (0);
            } else {
              do {
                if (dst_pos >= dst_sz) {
                  error("destination overflow");
                }
                dst[dst_pos++] = (tmp & 0x7f);
              } while (0);
            }
            tmp >>= 7;
          } while (tmp > 0);
        } while (0);
        do {
          size_t tmp = (1);
          do {
            if (tmp >= 128) {
              do {
                if (dst_pos >= dst_sz) {
                  error("destination overflow");
                }
                dst[dst_pos++] = (128 | (tmp & 0x7f));
              } while (0);
            } else {
              do {
                if (dst_pos >= dst_sz) {
                  error("destination overflow");
                }
                dst[dst_pos++] = (tmp & 0x7f);
              } while (0);
            }
            tmp >>= 7;
          } while (tmp > 0);
        } while (0);
      }
      src_pos++;
    }
  }
  do {
    if (dst_pos >= dst_sz) {
      error("destination overflow");
    }
    dst[dst_pos++] = (0xff);
  } while (0);
  do {
    size_t tmp = (0);
    do {
      if (tmp >= 128) {
        do {
          if (dst_pos >= dst_sz) {
            error("destination overflow");
          }
          dst[dst_pos++] = (128 | (tmp & 0x7f));
        } while (0);
      } else {
        do {
          if (dst_pos >= dst_sz) {
            error("destination overflow");
          }
          dst[dst_pos++] = (tmp & 0x7f);
        } while (0);
      }
      tmp >>= 7;
    } while (tmp > 0);
  } while (0);
  do {
    size_t tmp = (0);
    do {
      if (tmp >= 128) {
        do {
          if (dst_pos >= dst_sz) {
            error("destination overflow");
          }
          dst[dst_pos++] = (128 | (tmp & 0x7f));
        } while (0);
      } else {
        do {
          if (dst_pos >= dst_sz) {
            error("destination overflow");
          }
          dst[dst_pos++] = (tmp & 0x7f);
        } while (0);
      }
      tmp >>= 7;
    } while (tmp > 0);
  } while (0);
  return dst_pos;
}
```