user: 请从给定的汇编指令推导出C源代码：

```asm
<_print_charinfo>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x10,%rsp
  mov    %edi,-0x4(%rbp)
  cmpl   $0x7f,-0x4(%rbp)
  jle    L153
  lea    D281(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L153:
  cmpl   $0x7f,-0x4(%rbp)
  jne    L161
  lea    D131(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L161:
  cmpl   $0x1f,-0x4(%rbp)
  jle    L679
  mov    -0x4(%rbp),%eax
  movsbl %al,%eax
  mov    %eax,%esi
  lea    D83(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L679:
  cmpl   $0x1f,-0x4(%rbp)
  jne    L502
  lea    D60(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L502:
  cmpl   $0x1e,-0x4(%rbp)
  jne    L426
  lea    D321(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L426:
  cmpl   $0x1d,-0x4(%rbp)
  jne    L433
  lea    D82(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L433:
  cmpl   $0x1c,-0x4(%rbp)
  jne    L657
  lea    D287(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L657:
  cmpl   $0x1b,-0x4(%rbp)
  jne    L522
  lea    D59(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L522:
  cmpl   $0x1a,-0x4(%rbp)
  jne    L101
  lea    D147(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L101:
  cmpl   $0x19,-0x4(%rbp)
  jne    L631
  lea    D194(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L631:
  cmpl   $0x18,-0x4(%rbp)
  jne    L649
  lea    D327(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L649:
  cmpl   $0x17,-0x4(%rbp)
  jne    L355
  lea    D149(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L355:
  cmpl   $0x16,-0x4(%rbp)
  jne    L174
  lea    D32(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L174:
  cmpl   $0x15,-0x4(%rbp)
  jne    L640
  lea    D152(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L640:
  cmpl   $0x14,-0x4(%rbp)
  jne    L157
  lea    D12(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L157:
  cmpl   $0x13,-0x4(%rbp)
  jne    L13
  lea    D263(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L13:
  cmpl   $0x12,-0x4(%rbp)
  jne    L492
  lea    D220(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L492:
  cmpl   $0x11,-0x4(%rbp)
  jne    L260
  lea    D284(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L260:
  cmpl   $0x10,-0x4(%rbp)
  jne    L46
  lea    D338(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L46:
  cmpl   $0xf,-0x4(%rbp)
  jne    L33
  lea    D319(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L33:
  cmpl   $0xe,-0x4(%rbp)
  jne    L150
  lea    D123(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L150:
  cmpl   $0xd,-0x4(%rbp)
  jne    L129
  lea    D324(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L129:
  cmpl   $0xc,-0x4(%rbp)
  jne    L111
  lea    D307(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L111:
  cmpl   $0xb,-0x4(%rbp)
  jne    L370
  lea    D309(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L370:
  cmpl   $0xa,-0x4(%rbp)
  jne    L571
  lea    D298(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L571:
  cmpl   $0x9,-0x4(%rbp)
  jne    L392
  lea    D328(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L392:
  cmpl   $0x8,-0x4(%rbp)
  jne    L264
  lea    D225(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L264:
  cmpl   $0x7,-0x4(%rbp)
  jne    L354
  lea    D187(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L354:
  cmpl   $0x6,-0x4(%rbp)
  jne    L85
  lea    D106(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L85:
  cmpl   $0x5,-0x4(%rbp)
  jne    L242
  lea    D205(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L242:
  cmpl   $0x4,-0x4(%rbp)
  jne    L464
  lea    D173(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L464:
  cmpl   $0x3,-0x4(%rbp)
  jne    L221
  lea    D24(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L221:
  cmpl   $0x2,-0x4(%rbp)
  jne    L125
  lea    D124(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L125:
  cmpl   $0x1,-0x4(%rbp)
  jne    L487
  lea    D232(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L53
L487:
  cmpl   $0x0,-0x4(%rbp)
  jne    L53
  lea    D137(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L53:
  nop
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: tag: D281
datatype: string
name: disassemble_data
arguments: tag: D131
datatype: string
name: disassemble_data
arguments: tag: D83
datatype: string
name: disassemble_data
arguments: tag: D60
datatype: string
name: disassemble_data
arguments: tag: D321
datatype: string
name: disassemble_data
arguments: tag: D82
datatype: string
name: disassemble_data
arguments: tag: D287
datatype: string
name: disassemble_data
arguments: tag: D59
datatype: string
name: disassemble_data
arguments: tag: D147
datatype: string
name: disassemble_data
arguments: tag: D194
datatype: string
name: disassemble_data
arguments: tag: D327
datatype: string
name: disassemble_data
arguments: tag: D149
datatype: string
name: disassemble_data
arguments: tag: D32
datatype: string
name: disassemble_data
arguments: tag: D152
datatype: string
name: disassemble_data
arguments: tag: D12
datatype: string
name: disassemble_data
arguments: tag: D263
datatype: string
name: disassemble_data
arguments: tag: D220
datatype: string
name: disassemble_data
arguments: tag: D284
datatype: string
name: disassemble_data
arguments: tag: D338
datatype: string
name: disassemble_data
arguments: tag: D319
datatype: string
name: disassemble_data
arguments: tag: D123
datatype: string
name: disassemble_data
arguments: tag: D324
datatype: string
name: disassemble_data
arguments: tag: D307
datatype: string
name: disassemble_data
arguments: tag: D309
datatype: string
name: disassemble_data
arguments: tag: D298
datatype: string
name: disassemble_data
arguments: tag: D328
datatype: string
name: disassemble_data
arguments: tag: D225
datatype: string
name: disassemble_data
arguments: tag: D187
datatype: string
name: disassemble_data
arguments: tag: D106
datatype: string
name: disassemble_data
arguments: tag: D205
datatype: string
name: disassemble_data
arguments: tag: D173
datatype: string
name: disassemble_data
arguments: tag: D24
datatype: string
name: disassemble_data
arguments: tag: D124
datatype: string
name: disassemble_data
arguments: tag: D232
datatype: string
name: disassemble_data
arguments: tag: D137
datatype: string

tool: D281: WAT

tool: D131: house (U+2302, CP437+7F)

tool: D83: '%c'

tool: D60: black down-pointing triangle (U+25BC, CP437+1F)

tool: D321: black up-pointing triangle (U+25B2, CP437+1E)

tool: D82: left right arrow (U+2194, CP437+1D)

tool: D287: right angle (U+221F, CP437+1C)

tool: D59: leftwards arrow (U+2190, CP437+1B)

tool: D147: rightwards arrow (U+2192, CP437+1A)

tool: D194: downwards arrow (U+2193, CP437+19)

tool: D327: upwards arrow (U+2191, CP437+18)

tool: D149: up down arrow with base (U+21A8, CP437+17)

tool: D32: black rectangle (U+25AC, CP437+16)

tool: D152: section sign (U+00A7, CP437+15)

tool: D12: pilcrow (U+00B6, CP437+14)

tool: D263: double exclamation mark (U+203C, CP437+13)

tool: D220: up down arrow (U+2195, CP437+12)

tool: D284: black left-pointing pointer (U+25C4, CP437+11)

tool: D338: black right-pointing pointer (U+25BA, CP437+10)

tool: D319: white sun with rays (U+263C, CP437+0F)

tool: D123: beamed eighth notes (U+266B, CP437+0E)

tool: D324: eighth note (U+266A, CP437+0D)

tool: D307: female sign (U+2640, CP437+0C)

tool: D309: male sign (U+2642, CP437+0B)

tool: D298: inverse white circle (U+25D9, CP437+0A)

tool: D328: white circle (U+25CB, CP437+09)

tool: D225: inverse bullet (U+25D8, CP437+08)

tool: D187: bullet (U+2022, CP437+07)

tool: D106: black spade suit (U+2660, CP437+06)

tool: D205: black club suit (U+2663, CP437+05)

tool: D173: black diamond suit (U+2666, CP437+04)

tool: D24: black heart suit (U+2665, CP437+03)

tool: D124: black smiling face (U+263B, CP437+02)

tool: D232: white smiling face (U+263A, CP437+01)

tool: D137: blank (NUL)

assistant: ```c
void _print_charinfo(uint8_t ch) {
  if (ch > 0x7F) {
    printf("WAT");
  } else if (ch == 0x7F) {
    printf("house (U+2302, CP437+7F)");
  } else if (ch >= 0x20) {
    printf("'%c'", (char)ch);
  } else if (ch == 0x1F) {
    printf("black down-pointing triangle (U+25BC, CP437+1F)");
  } else if (ch == 0x1E) {
    printf("black up-pointing triangle (U+25B2, CP437+1E)");
  } else if (ch == 0x1D) {
    printf("left right arrow (U+2194, CP437+1D)");
  } else if (ch == 0x1C) {
    printf("right angle (U+221F, CP437+1C)");
  } else if (ch == 0x1B) {
    printf("leftwards arrow (U+2190, CP437+1B)");
  } else if (ch == 0x1A) {
    printf("rightwards arrow (U+2192, CP437+1A)");
  } else if (ch == 0x19) {
    printf("downwards arrow (U+2193, CP437+19)");
  } else if (ch == 0x18) {
    printf("upwards arrow (U+2191, CP437+18)");
  } else if (ch == 0x17) {
    printf("up down arrow with base (U+21A8, CP437+17)");
  } else if (ch == 0x16) {
    printf("black rectangle (U+25AC, CP437+16)");
  } else if (ch == 0x15) {
    printf("section sign (U+00A7, CP437+15)");
  } else if (ch == 0x14) {
    printf("pilcrow (U+00B6, CP437+14)");
  } else if (ch == 0x13) {
    printf("double exclamation mark (U+203C, CP437+13)");
  } else if (ch == 0x12) {
    printf("up down arrow (U+2195, CP437+12)");
  } else if (ch == 0x11) {
    printf("black left-pointing pointer (U+25C4, CP437+11)");
  } else if (ch == 0x10) {
    printf("black right-pointing pointer (U+25BA, CP437+10)");
  } else if (ch == 0x0F) {
    printf("white sun with rays (U+263C, CP437+0F)");
  } else if (ch == 0x0E) {
    printf("beamed eighth notes (U+266B, CP437+0E)");
  } else if (ch == 0x0D) {
    printf("eighth note (U+266A, CP437+0D)");
  } else if (ch == 0x0C) {
    printf("female sign (U+2640, CP437+0C)");
  } else if (ch == 0x0B) {
    printf("male sign (U+2642, CP437+0B)");
  } else if (ch == 0x0A) {
    printf("inverse white circle (U+25D9, CP437+0A)");
  } else if (ch == 0x09) {
    printf("white circle (U+25CB, CP437+09)");
  } else if (ch == 0x08) {
    printf("inverse bullet (U+25D8, CP437+08)");
  } else if (ch == 0x07) {
    printf("bullet (U+2022, CP437+07)");
  } else if (ch == 0x06) {
    printf("black spade suit (U+2660, CP437+06)");
  } else if (ch == 0x05) {
    printf("black club suit (U+2663, CP437+05)");
  } else if (ch == 0x04) {
    printf("black diamond suit (U+2666, CP437+04)");
  } else if (ch == 0x03) {
    printf("black heart suit (U+2665, CP437+03)");
  } else if (ch == 0x02) {
    printf("black smiling face (U+263B, CP437+02)");
  } else if (ch == 0x01) {
    printf("white smiling face (U+263A, CP437+01)");
  } else if (ch == 0x00) {
    printf("blank (NUL)");
  }
}
```