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

```asm
<draw_string>:
  endbr64
  push   %r15
  mov    %rsi,%r10
  push   %r14
  mov    %r9d,%r14d
  push   %r13
  mov    %ecx,%r13d
  push   %r12
  mov    %rdi,%r12
  push   %rbp
  mov    %r8d,%ebp
  push   %rbx
  mov    %r8d,%ebx
  sub    $0x28,%rsp
  mov    0x68(%rsp),%eax
  mov    0x68(%rsp),%r15d
  mov    %edx,0xc(%rsp)
  and    $0x1,%eax
  shr    $0x1f,%r15d
  add    0x68(%rsp),%r15d
  mov    %eax,(%rsp)
  mov    %r8d,%eax
  sar    %r15d
  and    $0x20,%eax
  and    $0x1,%ebx
  je     L91
  neg    %eax
  mov    $0x4,%ebx
  sbb    %eax,%eax
  add    $0xd,%eax
  mov    %eax,0x8(%rsp)
L80:
  mov    %r10,%rdi
  mov    %r10,0x10(%rsp)
  call   <strlen@plt>
  mov    0x8(%rsp),%edi
  mov    (%rsp),%r8d
  mov    %rax,%rsi
  mov    0x10(%rsp),%r10
  imul   %eax,%edi
  sub    %ebx,%edi
  mov    %edi,%edx
  imul   %r15d,%edx
  mov    %edx,%eax
  shr    $0x1f,%eax
  add    %edx,%eax
  mov    0xc(%rsp),%edx
  sar    %eax
  sub    %eax,%edx
  test   %r8d,%r8d
  je     L94
  test   %edi,%edi
  lea    0x3(%rdi),%eax
  cmovns %edi,%eax
  sar    $0x2,%eax
  sub    %eax,%edx
  mov    %edx,0xc(%rsp)
  test   %esi,%esi
  jle    L73
  imul   0x8(%rsp),%r15d
  lea    -0x1(%rsi),%eax
  mov    %r10,%rbx
  mov    %r14d,%r9d
  lea    0x1(%r10,%rax,1),%rax
  xor    %r10d,%r10d
  mov    %ebp,%r14d
  mov    %rax,0x18(%rsp)
  mov    %r10d,%ebp
  mov    %r15d,0x10(%rsp)
  xor    %r15d,%r15d
  nopl   0x0(%rax)
L98:
  mov    0x68(%rsp),%eax
  mov    %r15d,%edx
  movzbl (%rbx),%esi
  mov    %r14d,%r8d
  sar    %edx
  mov    %r13d,%ecx
  mov    %r12,%rdi
  add    $0x1,%rbx
  add    %ebp,%edx
  add    0xc(%rsp),%edx
  push   %rax
  mov    0x68(%rsp),%eax
  push   %rax
  mov    %r9d,0x10(%rsp)
  call   <draw_letter@plt>
  add    0x18(%rsp),%r15d
  add    0x20(%rsp),%ebp
  pop    %rax
  pop    %rdx
  cmp    0x18(%rsp),%rbx
  mov    (%rsp),%r9d
  jne    L98
L73:
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L94:
  test   %esi,%esi
  jle    L73
  imul   0x8(%rsp),%r15d
  lea    -0x1(%rsi),%eax
  mov    %r10,%rbx
  lea    0x1(%r10,%rax,1),%rax
  mov    %rax,(%rsp)
  mov    %r14d,%eax
  mov    %edx,%r14d
  mov    %r15d,0x8(%rsp)
  mov    %eax,%r15d
  nopw   0x0(%rax,%rax,1)
L42:
  mov    0x68(%rsp),%eax
  movzbl (%rbx),%esi
  mov    %r13d,%ecx
  mov    %r14d,%edx
  mov    %r15d,%r9d
  mov    %ebp,%r8d
  mov    %r12,%rdi
  add    $0x1,%rbx
  push   %rax
  mov    0x68(%rsp),%eax
  push   %rax
  call   <draw_letter@plt>
  add    0x18(%rsp),%r14d
  pop    %rcx
  pop    %rsi
  cmp    (%rsp),%rbx
  jne    L42
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L91:
  movl   $0x5,0x8(%rsp)
  test   %eax,%eax
  jne    L80
  mov    %r8d,%ebx
  and    $0x40,%ebx
  je     L63
  movl   $0x9,0x8(%rsp)
  mov    $0x1,%ebx
  jmp    L80
  nopw   0x0(%rax,%rax,1)
L63:
  movl   $0x7,0x8(%rsp)
  jmp    L80
```

assistant: ```c
void draw_string(unsigned char *pixbuf, const unsigned char input_string[], const int xposn, const int yposn, const int textflags, const int image_width, const int image_height, const int si) {
  int i, string_length, string_left_hand, letter_width, letter_gap;
  int half_si = si / 2, odd_si = si & 1, x_incr;
  if (textflags & 1) {
    letter_width = textflags & 32 ? 8 : 9;
    letter_gap = 4;
  } else if (textflags & 32) {
    letter_width = 5;
    letter_gap = 0;
  } else if (textflags & 64) {
    letter_width = 7 + 1;
    letter_gap = 1;
  } else {
    letter_width = 7;
    letter_gap = 0;
  }
  letter_width += letter_gap;
  string_length = (int)strlen((const char *)(input_string));
  string_left_hand = xposn - ((letter_width * string_length - letter_gap) * half_si) / 2;
  if (odd_si) {
    string_left_hand -= (letter_width * string_length - letter_gap) / 4;
  }
  for (i = 0; i < string_length; i++) {
    x_incr = i * letter_width * half_si;
    if (odd_si) {
      x_incr += i * letter_width / 2;
    }
    draw_letter(pixbuf, input_string[i], string_left_hand + x_incr, yposn, textflags, image_width, image_height, si);
  }
}
```