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

```asm
<put_char_cropped>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  mov    %edx,%r13d
  push   %r12
  mov    %edi,%r12d
  push   %rbp
  mov    %esi,%ebp
  movzbl %r12b,%r12d
  push   %rbx
  mov    %r9d,%ebx
  shl    $0x4,%r12
  lea    0x1(%rbp),%r14d
  sub    $0x28,%rsp
  mov    0x60(%rsp),%edi
  mov    %ecx,0x18(%rsp)
  mov    %r8d,0x1c(%rsp)
  call   <select_font@plt>
  lea    0x5(%rbp),%r10d
  lea    0x7(%rbp),%esi
  mov    %ebp,0x14(%rsp)
  mov    %rax,%r8
  lea    0x0(%r13,%r13,4),%eax
  lea    0x6(%rbp),%r9d
  mov    %esi,0x8(%rsp)
  shl    $0x7,%eax
  lea    (%r8,%r12,1),%rcx
  mov    %r13d,%r8d
  mov    %r10d,0xc(%rsp)
  add    %ebp,%eax
  lea    0x2(%rbp),%r13d
  lea    0x3(%rbp),%r12d
  mov    %r9d,0x10(%rsp)
  movslq %eax,%rdx
  lea    0x7(%rax),%edi
  add    $0x2807,%eax
  sub    %ecx,%r8d
  lea    0x4(%rbp),%r11d
  mov    %eax,%ebp
  jmp    L154
  nopl   (%rax)
L140:
  cmpl   $0x27f,0x14(%rsp)
  ja     L689
  test   %al,%al
  jne    L385
L689:
  mov    %edx,%esi
  lea    0x1(%rdx),%r15d
  cmp    $0x27f,%r14d
  ja     L291
  test   %al,%al
  jne    L382
L291:
  lea    0x2(%rsi),%r15d
  cmp    $0x27f,%r13d
  ja     L270
  test   %al,%al
  jne    L17
L270:
  lea    0x3(%rsi),%r15d
  cmp    $0x27f,%r12d
  ja     L108
  test   %al,%al
  jne    L461
L108:
  lea    0x4(%rsi),%r15d
  cmp    $0x27f,%r11d
  ja     L1
  test   %al,%al
  jne    L63
L1:
  cmpl   $0x27f,0xc(%rsp)
  lea    0x5(%rsi),%r15d
  ja     L364
  test   %al,%al
  jne    L159
L364:
  add    $0x6,%esi
  cmpl   $0x27f,0x10(%rsp)
  ja     L408
  test   %al,%al
  jne    L445
L408:
  cmpl   $0x27f,0x8(%rsp)
  ja     L276
  test   %al,%al
  jne    L191
L276:
  add    $0x280,%edi
  add    $0x280,%rdx
  add    $0x1,%rcx
  cmp    %edi,%ebp
  je     L164
L154:
  lea    (%r8,%rcx,1),%eax
  cmp    $0x1df,%eax
  setbe  %al
  test   %ebx,%ebx
  jne    L140
  mov    %edx,%esi
  lea    0x1(%rdx),%r15d
  cmp    $0x27f,%r14d
  ja     L462
  test   %al,%al
  jne    L58
L462:
  lea    0x2(%rsi),%r15d
  cmp    $0x27f,%r13d
  ja     L218
  test   %al,%al
  jne    L236
L218:
  lea    0x3(%rsi),%r15d
  cmp    $0x27f,%r12d
  ja     L666
  test   %al,%al
  jne    L373
L666:
  lea    0x4(%rsi),%r15d
  cmp    $0x27f,%r11d
  ja     L288
  test   %al,%al
  jne    L285
L288:
  cmpl   $0x27f,0xc(%rsp)
  lea    0x5(%rsi),%r15d
  ja     L225
  test   %al,%al
  jne    L682
L225:
  add    $0x6,%esi
  cmpl   $0x27f,0x10(%rsp)
  ja     L679
  test   %al,%al
  jne    L242
L679:
  cmpl   $0x27f,0x8(%rsp)
  ja     L276
  test   %al,%al
  je     L276
  testb  $0x2,(%rcx)
  je     L276
  mov    0x68(%rsp),%rsi
  movzbl 0x18(%rsp),%r10d
  movslq %edi,%rax
  mov    %r10b,(%rsi,%rax,1)
  jmp    L276
L164:
  add    $0x28,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L285:
  testb  $0x10,(%rcx)
  je     L288
  mov    0x68(%rsp),%r10
  movzbl 0x18(%rsp),%r9d
  movslq %r15d,%r15
  mov    %r9b,(%r10,%r15,1)
  jmp    L288
L682:
  testb  $0x8,(%rcx)
  je     L225
  mov    0x68(%rsp),%r10
  movzbl 0x18(%rsp),%r9d
  movslq %r15d,%r15
  mov    %r9b,(%r10,%r15,1)
  jmp    L225
L191:
  mov    0x68(%rsp),%rsi
  movslq %edi,%rax
  testb  $0x2,(%rcx)
  je     L572
  movzbl 0x18(%rsp),%r15d
  mov    %r15b,(%rsi,%rax,1)
  jmp    L276
L58:
  cmpb   $0x0,(%rcx)
  jns    L462
  mov    0x68(%rsp),%r10
  movzbl 0x18(%rsp),%r9d
  movslq %r15d,%r15
  mov    %r9b,(%r10,%r15,1)
  jmp    L462
L236:
  testb  $0x40,(%rcx)
  je     L218
  mov    0x68(%rsp),%r10
  movzbl 0x18(%rsp),%r9d
  movslq %r15d,%r15
  mov    %r9b,(%r10,%r15,1)
  jmp    L218
L373:
  testb  $0x20,(%rcx)
  je     L666
  mov    0x68(%rsp),%r10
  movzbl 0x18(%rsp),%r9d
  movslq %r15d,%r15
  mov    %r9b,(%r10,%r15,1)
  jmp    L666
L242:
  testb  $0x4,(%rcx)
  je     L679
  mov    0x68(%rsp),%r10
  movzbl 0x18(%rsp),%r9d
  movslq %esi,%rsi
  mov    %r9b,(%r10,%rsi,1)
  jmp    L679
L385:
  mov    0x68(%rsp),%rsi
  movzbl 0x1c(%rsp),%r15d
  mov    %r15b,(%rsi,%rdx,1)
  jmp    L689
L382:
  cmpb   $0x0,(%rcx)
  movslq %r15d,%r15
  jns    L571
  mov    0x68(%rsp),%r9
  movzbl 0x18(%rsp),%r10d
  mov    %r10b,(%r9,%r15,1)
  jmp    L291
L17:
  mov    0x68(%rsp),%r10
  movslq %r15d,%r15
  testb  $0x40,(%rcx)
  je     L201
  movzbl 0x18(%rsp),%r9d
  mov    %r9b,(%r10,%r15,1)
  jmp    L270
L461:
  mov    0x68(%rsp),%r10
  movslq %r15d,%r15
  testb  $0x20,(%rcx)
  je     L156
  movzbl 0x18(%rsp),%r9d
  mov    %r9b,(%r10,%r15,1)
  jmp    L108
L63:
  mov    0x68(%rsp),%r10
  movslq %r15d,%r15
  testb  $0x10,(%rcx)
  je     L105
  movzbl 0x18(%rsp),%r9d
  mov    %r9b,(%r10,%r15,1)
  jmp    L1
L159:
  mov    0x68(%rsp),%r10
  movslq %r15d,%r15
  testb  $0x8,(%rcx)
  je     L555
  movzbl 0x18(%rsp),%r9d
  mov    %r9b,(%r10,%r15,1)
  jmp    L364
L445:
  mov    0x68(%rsp),%r10
  movslq %esi,%rsi
  testb  $0x4,(%rcx)
  je     L516
  movzbl 0x18(%rsp),%r9d
  mov    %r9b,(%r10,%rsi,1)
  jmp    L408
L516:
  movzbl 0x1c(%rsp),%r9d
  mov    %r9b,(%r10,%rsi,1)
  jmp    L408
L105:
  movzbl 0x1c(%rsp),%r9d
  mov    %r9b,(%r10,%r15,1)
  jmp    L1
L555:
  movzbl 0x1c(%rsp),%r9d
  mov    %r9b,(%r10,%r15,1)
  jmp    L364
L201:
  movzbl 0x1c(%rsp),%r9d
  mov    %r9b,(%r10,%r15,1)
  jmp    L270
L156:
  movzbl 0x1c(%rsp),%r9d
  mov    %r9b,(%r10,%r15,1)
  jmp    L108
L572:
  movzbl 0x1c(%rsp),%r10d
  mov    %r10b,(%rsi,%rax,1)
  jmp    L276
L571:
  mov    0x68(%rsp),%r10
  movzbl 0x1c(%rsp),%r9d
  mov    %r9b,(%r10,%r15,1)
  jmp    L291
```

assistant: ```c
int put_char_cropped(unsigned char c, int x, int y, int fg_color, int bg_color, int overwrite, int which_font, unsigned char *buffer) {
  int xx, yy;
  int output_pointer;
  unsigned char(*font)[256][16];
  font = select_font(which_font);
  output_pointer = (y * 640) + x;
  for (yy = 0; yy < 16; yy++) {
    for (xx = 0; xx < 8; xx++) {
      if ((xx + x >= 0) && (yy + y >= 0) && (xx + x < 640) && (yy + y < 480)) {
        if ((*font)[c][yy] & (1 << (8 - xx))) {
          buffer[output_pointer] = fg_color;
        } else if (overwrite) {
          buffer[output_pointer] = bg_color;
        }
      }
      output_pointer++;
    }
    output_pointer += (640 - 8);
  }
  return 0;
}
```