user: 下面的汇编指令对应的C源代码是什么：

```asm
<draw_string>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %rdi,0x8(%rsp)
  mov    %rsi,%rbp
  mov    %edx,%r12d
  mov    %ecx,0x14(%rsp)
  mov    %r8d,0x10(%rsp)
  mov    %r9d,0x18(%rsp)
  mov    0x68(%rsp),%r13d
  mov    %r13d,%ebx
  shr    $0x1f,%ebx
  add    %r13d,%ebx
  sar    %ebx
  mov    %r13d,%r14d
  and    $0x1,%r14d
  mov    %r8d,%r15d
  and    $0x1,%r15d
  je     L35
  and    $0x20,%r8d
  mov    %r8d,%eax
  mov    $0x4,%r15d
  neg    %eax
  sbb    %eax,%eax
  add    $0x9,%eax
L92:
  add    %r15d,%eax
  mov    %eax,(%rsp)
  mov    %rbp,%rdi
  call   <strlen@plt>
  mov    %rax,%rdx
  mov    (%rsp),%ecx
  imul   %eax,%ecx
  sub    %r15d,%ecx
  mov    %ecx,%esi
  imul   %ebx,%esi
  mov    %esi,%eax
  shr    $0x1f,%eax
  add    %esi,%eax
  sar    %eax
  mov    %r12d,%edi
  sub    %eax,%edi
  mov    %edi,0x4(%rsp)
  test   %r14d,%r14d
  je     L28
  lea    0x3(%rcx),%eax
  test   %ecx,%ecx
  cmovns %ecx,%eax
  sar    $0x2,%eax
  sub    %eax,%edi
  mov    %edi,0x4(%rsp)
L28:
  test   %edx,%edx
  jle    L67
  imul   (%rsp),%ebx
  mov    %ebx,0x1c(%rsp)
  mov    %rbp,%rbx
  lea    -0x1(%rdx),%eax
  lea    0x1(%rbp,%rax,1),%r15
  mov    $0x0,%r12d
  mov    $0x0,%ebp
  jmp    L17
L35:
  mov    $0x5,%eax
  mov    0x10(%rsp),%edi
  test   $0x20,%dil
  jne    L92
  mov    %edi,%r15d
  and    $0x40,%r15d
  mov    $0x7,%eax
  je     L92
  mov    $0x1,%r15d
  mov    $0x8,%eax
  jmp    L92
L20:
  add    0x4(%rsp),%edx
  movzbl (%rbx),%esi
  push   %r13
  mov    0x68(%rsp),%eax
  push   %rax
  mov    0x28(%rsp),%r9d
  mov    0x20(%rsp),%r8d
  mov    0x24(%rsp),%ecx
  mov    0x18(%rsp),%rdi
  call   <draw_letter@plt>
  add    0x2c(%rsp),%ebp
  add    $0x1,%rbx
  add    0x10(%rsp),%r12d
  add    $0x10,%rsp
  cmp    %r15,%rbx
  je     L67
L17:
  mov    %ebp,%edx
  test   %r14d,%r14d
  je     L20
  mov    %r12d,%edx
  shr    $0x1f,%edx
  add    %r12d,%edx
  sar    %edx
  add    %ebp,%edx
  jmp    L20
L67:
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

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);
  }
}
```