user: 这段汇编代码用C语言表示是什么样的：

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

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