user: Demonstrate the C code that generates the assembly output below:

```asm
<tcbwtsortstrheap>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xb0,%rsp
  mov    %rdi,-0x98(%rbp)
  mov    %esi,-0x9c(%rbp)
  mov    %edx,-0xa0(%rbp)
  mov    %ecx,-0xa4(%rbp)
  cmpq   $0x0,-0x98(%rbp)
  je     L183
  cmpl   $0x0,-0x9c(%rbp)
  js     L183
  cmpl   $0x0,-0xa0(%rbp)
  js     L183
  mov    $0x1,%eax
  jmp    L208
L183:
  mov    $0x0,%eax
L208:
  mov    %eax,%edi
  call   <assert@plt>
  subl   $0x1,-0x9c(%rbp)
  mov    -0x9c(%rbp),%eax
  sar    %eax
  add    $0x1,%eax
  mov    %eax,-0x88(%rbp)
  mov    -0x9c(%rbp),%eax
  mov    %eax,-0x84(%rbp)
  jmp    L282
L327:
  subl   $0x1,-0x88(%rbp)
  mov    -0x88(%rbp),%eax
  mov    %eax,-0x80(%rbp)
  mov    -0x80(%rbp),%eax
  add    %eax,%eax
  mov    %eax,-0x7c(%rbp)
  jmp    L349
L71:
  mov    -0x7c(%rbp),%eax
  cmp    -0x84(%rbp),%eax
  jge    L221
  movl   $0x0,-0x78(%rbp)
  mov    -0x7c(%rbp),%eax
  cltq
  add    $0x1,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x7c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0xa4(%rbp),%eax
  mov    %eax,-0x74(%rbp)
  jmp    L201
L341:
  mov    -0x74(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x74(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x20(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  je     L30
  mov    -0x74(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    -0x74(%rbp),%edx
  movslq %edx,%rcx
  mov    -0x20(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rdx),%edx
  movzbl %dl,%edx
  sub    %edx,%eax
  mov    %eax,-0x78(%rbp)
  jmp    L134
L30:
  addl   $0x1,-0x74(%rbp)
L201:
  mov    -0x74(%rbp),%eax
  cmp    -0xa0(%rbp),%eax
  jl     L341
L134:
  cmpl   $0x0,-0x78(%rbp)
  jle    L221
  addl   $0x1,-0x7c(%rbp)
L221:
  movl   $0x0,-0x70(%rbp)
  mov    -0x80(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x7c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0xa4(%rbp),%eax
  mov    %eax,-0x6c(%rbp)
  jmp    L178
L12:
  mov    -0x6c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x6c(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x10(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  je     L99
  mov    -0x6c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    -0x6c(%rbp),%edx
  movslq %edx,%rcx
  mov    -0x10(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rdx),%edx
  movzbl %dl,%edx
  sub    %edx,%eax
  mov    %eax,-0x70(%rbp)
  jmp    L85
L99:
  addl   $0x1,-0x6c(%rbp)
L178:
  mov    -0x6c(%rbp),%eax
  cmp    -0xa0(%rbp),%eax
  jl     L12
L85:
  cmpl   $0x0,-0x70(%rbp)
  js     L153
  jmp    L282
L153:
  mov    -0x80(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x7c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  mov    -0x80(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,8),%rcx
  mov    -0x98(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%rax
  mov    %rax,(%rdx)
  mov    -0x7c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x98(%rbp),%rax
  add    %rax,%rdx
  mov    -0x8(%rbp),%rax
  mov    %rax,(%rdx)
  mov    -0x7c(%rbp),%eax
  mov    %eax,-0x80(%rbp)
  mov    -0x80(%rbp),%eax
  add    %eax,%eax
  mov    %eax,-0x7c(%rbp)
L349:
  mov    -0x7c(%rbp),%eax
  cmp    -0x84(%rbp),%eax
  jle    L71
L282:
  cmpl   $0x0,-0x88(%rbp)
  jg     L327
  jmp    L68
L319:
  mov    -0x98(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,-0x50(%rbp)
  mov    -0x84(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x98(%rbp),%rax
  mov    %rdx,(%rax)
  mov    -0x84(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x98(%rbp),%rax
  add    %rax,%rdx
  mov    -0x50(%rbp),%rax
  mov    %rax,(%rdx)
  subl   $0x1,-0x84(%rbp)
  mov    -0x88(%rbp),%eax
  mov    %eax,-0x68(%rbp)
  mov    -0x68(%rbp),%eax
  add    %eax,%eax
  mov    %eax,-0x64(%rbp)
  jmp    L263
L212:
  mov    -0x64(%rbp),%eax
  cmp    -0x84(%rbp),%eax
  jge    L79
  movl   $0x0,-0x60(%rbp)
  mov    -0x64(%rbp),%eax
  cltq
  add    $0x1,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x48(%rbp)
  mov    -0x64(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x40(%rbp)
  movl   $0x0,-0x5c(%rbp)
  jmp    L165
L51:
  mov    -0x5c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x5c(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x40(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  je     L92
  mov    -0x5c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    -0x5c(%rbp),%edx
  movslq %edx,%rcx
  mov    -0x40(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rdx),%edx
  movzbl %dl,%edx
  sub    %edx,%eax
  mov    %eax,-0x60(%rbp)
  jmp    L157
L92:
  addl   $0x1,-0x5c(%rbp)
L165:
  mov    -0x5c(%rbp),%eax
  cmp    -0xa0(%rbp),%eax
  jl     L51
L157:
  cmpl   $0x0,-0x60(%rbp)
  jle    L79
  addl   $0x1,-0x64(%rbp)
L79:
  movl   $0x0,-0x58(%rbp)
  mov    -0x68(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x38(%rbp)
  mov    -0x64(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x30(%rbp)
  movl   $0x0,-0x54(%rbp)
  jmp    L265
L354:
  mov    -0x54(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x54(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x30(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  je     L303
  mov    -0x54(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    -0x54(%rbp),%edx
  movslq %edx,%rcx
  mov    -0x30(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rdx),%edx
  movzbl %dl,%edx
  sub    %edx,%eax
  mov    %eax,-0x58(%rbp)
  jmp    L340
L303:
  addl   $0x1,-0x54(%rbp)
L265:
  mov    -0x54(%rbp),%eax
  cmp    -0xa0(%rbp),%eax
  jl     L354
L340:
  cmpl   $0x0,-0x58(%rbp)
  js     L122
  jmp    L68
L122:
  mov    -0x68(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x50(%rbp)
  mov    -0x64(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  mov    -0x68(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,8),%rcx
  mov    -0x98(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%rax
  mov    %rax,(%rdx)
  mov    -0x64(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x98(%rbp),%rax
  add    %rax,%rdx
  mov    -0x50(%rbp),%rax
  mov    %rax,(%rdx)
  mov    -0x64(%rbp),%eax
  mov    %eax,-0x68(%rbp)
  mov    -0x68(%rbp),%eax
  add    %eax,%eax
  mov    %eax,-0x64(%rbp)
L263:
  mov    -0x64(%rbp),%eax
  cmp    -0x84(%rbp),%eax
  jle    L212
L68:
  cmpl   $0x0,-0x84(%rbp)
  jg     L319
  nop
  nop
  leave
  ret
```

assistant: ```c
void tcbwtsortstrheap(const char **arrays, int anum, int len, int skip) {
  assert(arrays && anum >= 0 && len >= 0);
  anum--;
  int bottom = (anum >> 1) + 1;
  int top = anum;
  while (bottom > 0) {
    bottom--;
    int mybot = bottom;
    int i = mybot * 2;
    while (i <= top) {
      if (i < top) {
        int cmp = 0;
        const unsigned char *ap = (unsigned char *)arrays[i + 1];
        const unsigned char *bp = (unsigned char *)arrays[i];
        for (int j = skip; j < len; j++) {
          if (ap[j] != bp[j]) {
            cmp = ap[j] - bp[j];
            break;
          }
        }
        if (cmp > 0)
          i++;
      }
      int cmp = 0;
      const unsigned char *ap = (unsigned char *)arrays[mybot];
      const unsigned char *bp = (unsigned char *)arrays[i];
      for (int j = skip; j < len; j++) {
        if (ap[j] != bp[j]) {
          cmp = ap[j] - bp[j];
          break;
        }
      }
      if (cmp >= 0)
        break;
      const char *swap = arrays[mybot];
      arrays[mybot] = arrays[i];
      arrays[i] = swap;
      mybot = i;
      i = mybot * 2;
    }
  }
  while (top > 0) {
    const char *swap = arrays[0];
    arrays[0] = arrays[top];
    arrays[top] = swap;
    top--;
    int mybot = bottom;
    int i = mybot * 2;
    while (i <= top) {
      if (i < top) {
        int cmp = 0;
        const unsigned char *ap = (unsigned char *)arrays[i + 1];
        const unsigned char *bp = (unsigned char *)arrays[i];
        for (int j = 0; j < len; j++) {
          if (ap[j] != bp[j]) {
            cmp = ap[j] - bp[j];
            break;
          }
        }
        if (cmp > 0)
          i++;
      }
      int cmp = 0;
      const unsigned char *ap = (unsigned char *)arrays[mybot];
      const unsigned char *bp = (unsigned char *)arrays[i];
      for (int j = 0; j < len; j++) {
        if (ap[j] != bp[j]) {
          cmp = ap[j] - bp[j];
          break;
        }
      }
      if (cmp >= 0)
        break;
      swap = arrays[mybot];
      arrays[mybot] = arrays[i];
      arrays[i] = swap;
      mybot = i;
      i = mybot * 2;
    }
  }
}
```