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

```asm
<punycode_encode>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %rsi,-0x50(%rbp)
  mov    %rdx,-0x58(%rbp)
  mov    %rcx,-0x60(%rbp)
  movq   $0x0,-0x18(%rbp)
  movq   $0x0,-0x10(%rbp)
  jmp    L122
L162:
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cmp    $0x7f,%eax
  jg     L201
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%ecx
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  mov    -0x58(%rbp),%rdx
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
L201:
  addq   $0x1,-0x18(%rbp)
L122:
  mov    -0x18(%rbp),%rax
  cmp    -0x50(%rbp),%rax
  jae    L117
  mov    -0x60(%rbp),%rax
  mov    (%rax),%rax
  cmp    %rax,-0x10(%rbp)
  jb     L162
L117:
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x40(%rbp)
  mov    -0x40(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x10(%rbp)
  je     L71
  mov    -0x60(%rbp),%rax
  mov    (%rax),%rax
  cmp    %rax,-0x10(%rbp)
  jae    L71
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  mov    -0x58(%rbp),%rdx
  add    %rdx,%rax
  movb   $0x2d,(%rax)
L71:
  movq   $0x80,-0x20(%rbp)
  movq   $0x48,-0x30(%rbp)
  movq   $0x0,-0x38(%rbp)
  jmp    L41
L30:
  mov    D5(%rip),%rax
  mov    (%rax),%rax
  mov    %rax,-0x28(%rbp)
  movq   $0x0,-0x18(%rbp)
  jmp    L171
L180:
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cltq
  cmp    %rax,-0x20(%rbp)
  ja     L209
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cltq
  cmp    %rax,-0x28(%rbp)
  jbe    L209
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cltq
  mov    %rax,-0x28(%rbp)
L209:
  addq   $0x1,-0x18(%rbp)
L171:
  mov    -0x18(%rbp),%rax
  cmp    -0x50(%rbp),%rax
  jb     L180
  mov    -0x28(%rbp),%rax
  sub    -0x20(%rbp),%rax
  mov    %rax,%rcx
  mov    D5(%rip),%rax
  mov    (%rax),%rax
  sub    -0x38(%rbp),%rax
  mov    -0x40(%rbp),%rdx
  lea    0x1(%rdx),%rsi
  mov    $0x0,%edx
  div    %rsi
  cmp    %rax,%rcx
  jbe    L203
  mov    $0x0,%edi
  call   <assert@plt>
  jmp    L94
L203:
  mov    -0x28(%rbp),%rax
  sub    -0x20(%rbp),%rax
  mov    -0x40(%rbp),%rdx
  add    $0x1,%rdx
  imul   %rdx,%rax
  add    %rax,-0x38(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  movq   $0x0,-0x18(%rbp)
  jmp    L206
L28:
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cltq
  cmp    %rax,-0x20(%rbp)
  jbe    L202
  addq   $0x1,-0x38(%rbp)
  cmpq   $0x0,-0x38(%rbp)
  jne    L79
  mov    $0x0,%edi
  call   <assert@plt>
  jmp    L94
L202:
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cltq
  cmp    %rax,-0x20(%rbp)
  jne    L79
  mov    -0x60(%rbp),%rax
  mov    (%rax),%rax
  sub    -0x10(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x58(%rbp),%rcx
  mov    -0x10(%rbp),%rax
  lea    (%rcx,%rax,1),%rdi
  mov    -0x38(%rbp),%rsi
  mov    -0x30(%rbp),%rax
  mov    %rdx,%rcx
  mov    %rdi,%rdx
  mov    %rax,%rdi
  call   <encode_var_int@plt>
  add    %rax,-0x10(%rbp)
  mov    -0x40(%rbp),%rax
  cmp    -0x8(%rbp),%rax
  sete   %al
  movzbl %al,%edx
  mov    -0x40(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    -0x38(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <adapt_bias@plt>
  mov    %rax,-0x30(%rbp)
  movq   $0x0,-0x38(%rbp)
  addq   $0x1,-0x40(%rbp)
L79:
  addq   $0x1,-0x18(%rbp)
L206:
  mov    -0x18(%rbp),%rax
  cmp    -0x50(%rbp),%rax
  jb     L28
  addq   $0x1,-0x20(%rbp)
  addq   $0x1,-0x38(%rbp)
L41:
  mov    -0x40(%rbp),%rax
  cmp    -0x50(%rbp),%rax
  jae    L45
  mov    -0x60(%rbp),%rax
  mov    (%rax),%rax
  cmp    %rax,-0x10(%rbp)
  jb     L30
L45:
  nop
L94:
  mov    -0x60(%rbp),%rax
  mov    -0x10(%rbp),%rdx
  mov    %rdx,(%rax)
  mov    -0x18(%rbp),%rax
  leave
  ret
```

assistant: ```c
size_t punycode_encode(const uint32_t *const src, const size_t srclen, char *const dst, size_t *const dstlen) {
  size_t b, h;
  size_t delta, bias;
  size_t m, n;
  size_t si, di;
  for (si = 0, di = 0; si < srclen && di < *dstlen; si++) {
    if (src[si] < 128) {
      dst[di++] = src[si];
    }
  }
  b = h = di;
  if (di > 0 && di < *dstlen) {
    dst[di++] = '-';
  }
  n = 128;
  bias = 72;
  delta = 0;
  for (; h < srclen && di < *dstlen; n++, delta++) {
    for (m = SIZE_MAX, si = 0; si < srclen; si++) {
      if (src[si] >= n && src[si] < m) {
        m = src[si];
      }
    }
    if ((m - n) > (SIZE_MAX - delta) / (h + 1)) {
      assert(0 && "OVERFLOW");
      goto fail;
    }
    delta += (m - n) * (h + 1);
    n = m;
    for (si = 0; si < srclen; si++) {
      if (src[si] < n) {
        if (++delta == 0) {
          assert(0 && "OVERFLOW");
          goto fail;
        }
      } else if (src[si] == n) {
        di += encode_var_int(bias, delta, &dst[di], *dstlen - di);
        bias = adapt_bias(delta, h + 1, h == b);
        delta = 0;
        h++;
      }
    }
  }
fail:
  *dstlen = di;
  return si;
}
```