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

```asm
<ceph_armor>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  movl   $0x0,-0x8(%rbp)
  movl   $0x0,-0x4(%rbp)
  jmp    L35
L1:
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0xb(%rbp)
  movzbl -0xb(%rbp),%eax
  shr    $0x2,%al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <encode_bits@plt>
  mov    %rax,%rcx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x20(%rbp),%rax
  cmp    -0x28(%rbp),%rax
  jae    L52
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0xa(%rbp)
  movzbl -0xb(%rbp),%eax
  shl    $0x4,%eax
  and    $0x30,%eax
  mov    %eax,%edx
  movzbl -0xa(%rbp),%eax
  shr    $0x4,%al
  or     %edx,%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <encode_bits@plt>
  mov    %rax,%rcx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x20(%rbp),%rax
  cmp    -0x28(%rbp),%rax
  jae    L68
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0x9(%rbp)
  movzbl -0xa(%rbp),%eax
  shl    $0x2,%eax
  and    $0x3c,%eax
  mov    %eax,%edx
  movzbl -0x9(%rbp),%eax
  shr    $0x6,%al
  or     %edx,%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <encode_bits@plt>
  mov    %rax,%rcx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  movzbl -0x9(%rbp),%eax
  and    $0x3f,%eax
  mov    %eax,%edi
  call   <encode_bits@plt>
  mov    %rax,%rcx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  jmp    L11
L68:
  movzbl -0xa(%rbp),%eax
  shl    $0x2,%eax
  movzbl %al,%eax
  and    $0x3c,%eax
  mov    %eax,%edi
  call   <encode_bits@plt>
  mov    %rax,%rcx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movb   $0x3d,(%rax)
  jmp    L11
L52:
  movzbl -0xb(%rbp),%eax
  shl    $0x4,%eax
  movzbl %al,%eax
  and    $0x30,%eax
  mov    %eax,%edi
  call   <encode_bits@plt>
  mov    %rax,%rcx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movb   $0x3d,(%rax)
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movb   $0x3d,(%rax)
L11:
  addl   $0x4,-0x8(%rbp)
  addl   $0x4,-0x4(%rbp)
  cmpl   $0x40,-0x4(%rbp)
  jne    L35
  movl   $0x0,-0x4(%rbp)
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movb   $0xa,(%rax)
  addl   $0x1,-0x8(%rbp)
L35:
  mov    -0x20(%rbp),%rax
  cmp    -0x28(%rbp),%rax
  jb     L1
  mov    -0x8(%rbp),%eax
  leave
  ret
```

assistant: ```c
int ceph_armor(char *dst, const char *src, const char *end) {
  int olen = 0;
  int line = 0;
  while (src < end) {
    unsigned char a, b, c;
    a = *src++;
    *dst++ = encode_bits(a >> 2);
    if (src < end) {
      b = *src++;
      *dst++ = encode_bits(((a & 3) << 4) | (b >> 4));
      if (src < end) {
        c = *src++;
        *dst++ = encode_bits(((b & 15) << 2) | (c >> 6));
        *dst++ = encode_bits(c & 63);
      } else {
        *dst++ = encode_bits((b & 15) << 2);
        *dst++ = '=';
      }
    } else {
      *dst++ = encode_bits(((a & 3) << 4));
      *dst++ = '=';
      *dst++ = '=';
    }
    olen += 4;
    line += 4;
    if (line == 64) {
      line = 0;
      *(dst++) = '\n';
      olen++;
    }
  }
  return olen;
}
```