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

```asm
<ceph_unarmor>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %rdi,0x18(%rsp)
  cmp    %rcx,%rdx
  jae    L86
  mov    %rsi,%r12
  mov    %rdx,%rbp
  mov    %rcx,%r15
  movl   $0x0,0x14(%rsp)
  lea    0x18(%rsp),%r13
  jmp    L21
L174:
  add    $0x1,%rbp
L20:
  cmp    %r15,%rbp
  jae    L111
L21:
  movzbl 0x0(%rbp),%edi
  cmp    $0xa,%dil
  je     L174
  lea    0x4(%rbp),%r14
  cmp    %r15,%r14
  ja     L163
  movsbl %dil,%edi
  call   <decode_bits@plt>
  mov    %eax,0xc(%rsp)
  movsbl 0x1(%rbp),%edi
  call   <decode_bits@plt>
  mov    %eax,%ebx
  movsbl 0x2(%rbp),%edi
  call   <decode_bits@plt>
  mov    %eax,0x8(%rsp)
  movsbl 0x3(%rbp),%edi
  call   <decode_bits@plt>
  mov    %eax,%esi
  mov    %eax,0x10(%rsp)
  mov    0xc(%rsp),%ecx
  or     %ebx,%ecx
  mov    %ecx,%eax
  or     0x8(%rsp),%eax
  or     %esi,%eax
  js     L159
  mov    0xc(%rsp),%edx
  shl    $0x2,%edx
  mov    %ebx,%eax
  sar    $0x4,%eax
  or     %eax,%edx
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <set_str_val@plt>
  test   %eax,%eax
  js     L144
  cmpb   $0x3d,0x2(%rbp)
  je     L162
  shl    $0x4,%ebx
  movzbl %bl,%edx
  mov    0x8(%rsp),%eax
  sar    $0x2,%eax
  or     %eax,%edx
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <set_str_val@plt>
  test   %eax,%eax
  js     L129
  cmpb   $0x3d,0x3(%rbp)
  je     L78
  mov    0x8(%rsp),%edx
  shl    $0x6,%edx
  movzbl %dl,%edx
  or     0x10(%rsp),%edx
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <set_str_val@plt>
  test   %eax,%eax
  js     L113
  addl   $0x3,0x14(%rsp)
  mov    %r14,%rbp
  jmp    L20
L163:
  mov    D14(%rip),%rax
  mov    (%rax),%eax
  neg    %eax
  mov    %eax,0x14(%rsp)
  jmp    L111
L159:
  mov    D14(%rip),%rax
  mov    (%rax),%eax
  neg    %eax
  mov    %eax,0x14(%rsp)
L111:
  mov    0x14(%rsp),%eax
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L162:
  addl   $0x1,0x14(%rsp)
  jmp    L111
L78:
  addl   $0x2,0x14(%rsp)
  jmp    L111
L86:
  movl   $0x0,0x14(%rsp)
  jmp    L111
L144:
  mov    %eax,0x14(%rsp)
  jmp    L111
L129:
  mov    %eax,0x14(%rsp)
  jmp    L111
L113:
  mov    %eax,0x14(%rsp)
  jmp    L111
```

assistant: ```c
int ceph_unarmor(char *dst, const char *dst_end, const char *src, const char *end) {
  int olen = 0;
  while (src < end) {
    int a, b, c, d;
    if (src[0] == '\n') {
      src++;
      continue;
    }
    if (src + 4 > end)
      return -EINVAL;
    a = decode_bits(src[0]);
    b = decode_bits(src[1]);
    c = decode_bits(src[2]);
    d = decode_bits(src[3]);
    if (a < 0 || b < 0 || c < 0 || d < 0)
      return -EINVAL;
    do {
      int __ret = set_str_val(&dst, dst_end, (a << 2) | (b >> 4));
      if (__ret < 0)
        return __ret;
    } while (0);
    ;
    if (src[2] == '=')
      return olen + 1;
    do {
      int __ret = set_str_val(&dst, dst_end, ((b & 15) << 4) | (c >> 2));
      if (__ret < 0)
        return __ret;
    } while (0);
    ;
    if (src[3] == '=')
      return olen + 2;
    do {
      int __ret = set_str_val(&dst, dst_end, ((c & 3) << 6) | d);
      if (__ret < 0)
        return __ret;
    } while (0);
    ;
    olen += 3;
    src += 4;
  }
  return olen;
}
```