user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<show_KeyboardStatus>:
  endbr64
  push   %r14
  mov    $0x3b,%edx
  push   %r13
  push   %r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  sub    $0x10,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x8(%rsp)
  xor    %eax,%eax
  lea    0x4(%rsp),%r12
  movl   $0x0,0x4(%rsp)
  mov    %r12,%rsi
  call   <scanto@plt>
  cmp    $0x1b,%eax
  je     L166
L52:
  lea    D403(%rip),%rsi
L307:
  lea    D312(%rip),%r13
  mov    %r13,%rdi
  call   <show_result@plt>
  mov    $0x6e,%edx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  mov    0x4(%rsp),%r14d
  call   <scan_any@plt>
  mov    %eax,%ebx
  cmp    %r14d,0x4(%rsp)
  jne    L98
L392:
  mov    0x8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L174
  add    $0x10,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopl   0x0(%rax,%rax,1)
L98:
  mov    $0xa,%esi
  mov    $0x5,%edi
  call   <vt_move@plt>
  lea    D355(%rip),%rsi
  cmp    $0x3,%ebx
  je     L327
  lea    D56(%rip),%rsi
  cmp    $0x8,%ebx
  je     L327
  test   %ebx,%ebx
  lea    D353(%rip),%rsi
  lea    D383(%rip),%rax
  cmove  %rax,%rsi
L327:
  mov    %r13,%rdi
  call   <show_result@plt>
  mov    $0xa,%esi
  mov    $0x6,%edi
  call   <vt_move@plt>
  mov    %r12,%rsi
  mov    $0x6e,%edx
  mov    %rbp,%rdi
  call   <scan_any@plt>
  lea    D246(%rip),%rsi
  test   %eax,%eax
  je     L169
  cmp    $0x1,%eax
  lea    D66(%rip),%rsi
  lea    D297(%rip),%rax
  cmove  %rax,%rsi
L169:
  mov    %r13,%rdi
  call   <show_result@plt>
  jmp    L392
  nop
L166:
  mov    $0x6e,%edx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <scan_any@plt>
  test   %eax,%eax
  je     L52
  cmp    $0x28,%eax
  ja     L229
  lea    D94(%rip),%rdx
  mov    %eax,%eax
  movslq (%rdx,%rax,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
L229:
  lea    D171(%rip),%rsi
  jmp    L307
  lea    D29(%rip),%rsi
  jmp    L307
  lea    D323(%rip),%rsi
  jmp    L307
  lea    D142(%rip),%rsi
  jmp    L307
  lea    D177(%rip),%rsi
  jmp    L307
  lea    D59(%rip),%rsi
  jmp    L307
  lea    D268(%rip),%rsi
  jmp    L307
  lea    D40(%rip),%rsi
  jmp    L307
  lea    D360(%rip),%rsi
  jmp    L307
  lea    D324(%rip),%rsi
  jmp    L307
  lea    D290(%rip),%rsi
  jmp    L307
  lea    D302(%rip),%rsi
  jmp    L307
  lea    D213(%rip),%rsi
  jmp    L307
  lea    D192(%rip),%rsi
  jmp    L307
  lea    D168(%rip),%rsi
  jmp    L307
  lea    D311(%rip),%rsi
  jmp    L307
  lea    D154(%rip),%rsi
  jmp    L307
  lea    D108(%rip),%rsi
  jmp    L307
  lea    D134(%rip),%rsi
  jmp    L307
  lea    D266(%rip),%rsi
  jmp    L307
  lea    D196(%rip),%rsi
  jmp    L307
  lea    D87(%rip),%rsi
  jmp    L307
  lea    D158(%rip),%rsi
  jmp    L307
  lea    D255(%rip),%rsi
  jmp    L307
  lea    D107(%rip),%rsi
  jmp    L307
  lea    D0(%rip),%rsi
  jmp    L307
  lea    D62(%rip),%rsi
  jmp    L307
  lea    D20(%rip),%rsi
  jmp    L307
  lea    D170(%rip),%rsi
  jmp    L307
  lea    D34(%rip),%rsi
  jmp    L307
  lea    D366(%rip),%rsi
  jmp    L307
L174:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: label: D403
datatype: string
name: disassemble_data
arguments: label: D312
datatype: string
name: disassemble_data
arguments: label: D355
datatype: string
name: disassemble_data
arguments: label: D56
datatype: string
name: disassemble_data
arguments: label: D353
datatype: string
name: disassemble_data
arguments: label: D383
datatype: string
name: disassemble_data
arguments: label: D246
datatype: string
name: disassemble_data
arguments: label: D66
datatype: string
name: disassemble_data
arguments: label: D297
datatype: string
name: disassemble_data
arguments: label: D171
datatype: string
name: disassemble_data
arguments: label: D29
datatype: string
name: disassemble_data
arguments: label: D323
datatype: string
name: disassemble_data
arguments: label: D142
datatype: string
name: disassemble_data
arguments: label: D177
datatype: string
name: disassemble_data
arguments: label: D59
datatype: string
name: disassemble_data
arguments: label: D268
datatype: string
name: disassemble_data
arguments: label: D40
datatype: string
name: disassemble_data
arguments: label: D360
datatype: string
name: disassemble_data
arguments: label: D324
datatype: string
name: disassemble_data
arguments: label: D290
datatype: string
name: disassemble_data
arguments: label: D302
datatype: string
name: disassemble_data
arguments: label: D213
datatype: string
name: disassemble_data
arguments: label: D192
datatype: string
name: disassemble_data
arguments: label: D168
datatype: string
name: disassemble_data
arguments: label: D311
datatype: string
name: disassemble_data
arguments: label: D154
datatype: string
name: disassemble_data
arguments: label: D108
datatype: string
name: disassemble_data
arguments: label: D134
datatype: string
name: disassemble_data
arguments: label: D266
datatype: string
name: disassemble_data
arguments: label: D196
datatype: string
name: disassemble_data
arguments: label: D87
datatype: string
name: disassemble_data
arguments: label: D158
datatype: string
name: disassemble_data
arguments: label: D255
datatype: string
name: disassemble_data
arguments: label: D107
datatype: string
name: disassemble_data
arguments: label: D0
datatype: string
name: disassemble_data
arguments: label: D62
datatype: string
name: disassemble_data
arguments: label: D20
datatype: string
name: disassemble_data
arguments: label: D170
datatype: string
name: disassemble_data
arguments: label: D34
datatype: string
name: disassemble_data
arguments: label: D366
datatype: string

tool: D403: failed

tool: D312: %s

tool: D355: no keyboard

tool: D56: keyboard busy

tool: D353: unknown keyboard status

tool: D383: keyboard ready

tool: D246: LK201

tool: D66: unknown keyboard type

tool: D297: LK401

tool: D171: unknown

tool: D29: Latin American

tool: D323: Russian

tool: D142: SCS

tool: D177: Romanian

tool: D59: Polish

tool: D268: Czech

tool: D40: Slovak

tool: D360: Spanish National

tool: D324: Hungarian

tool: D290: Turkish F/Turkish

tool: D302: Turkish Q/Turkish

tool: D213: Canadian (English)

tool: D192: Greek

tool: D168: Hebrew

tool: D311: Portugese

tool: D154: Spanish Int.

tool: D108: French/Belgian

tool: D134: Norwegian/Danish

tool: D266: Swedish

tool: D196: Swiss (German)

tool: D87: Swiss (French)

tool: D158: Italian

tool: D255: Dutch

tool: D107: German

tool: D0: Finnish

tool: D62: Danish

tool: D20: French Canadian

tool: D170: Flemish

tool: D34: North American/ASCII

tool: D366: British

assistant: ```c
void show_KeyboardStatus(char *report) {
  int pos = 0;
  int code;
  int save;
  const char *show = "failed";
  if ((code = scanto(report, &pos, ';')) == 27 && (code = scan_any(report, &pos, 'n')) != 0) {
    switch (code) {
    case 1:
      show = "North American/ASCII";
      break;
    case 2:
      show = "British";
      break;
    case 3:
      show = "Flemish";
      break;
    case 4:
      show = "French Canadian";
      break;
    case 5:
      show = "Danish";
      break;
    case 6:
      show = "Finnish";
      break;
    case 7:
      show = "German";
      break;
    case 8:
      show = "Dutch";
      break;
    case 9:
      show = "Italian";
      break;
    case 10:
      show = "Swiss (French)";
      break;
    case 11:
      show = "Swiss (German)";
      break;
    case 12:
      show = "Swedish";
      break;
    case 13:
      show = "Norwegian/Danish";
      break;
    case 14:
      show = "French/Belgian";
      break;
    case 15:
      show = "Spanish Int.";
      break;
    case 16:
      show = "Portugese";
      break;
    case 19:
      show = "Hebrew";
      break;
    case 22:
      show = "Greek";
      break;
    case 28:
      show = "Canadian (English)";
      break;
    case 29:
      show = "Turkish Q/Turkish";
      break;
    case 30:
      show = "Turkish F/Turkish";
      break;
    case 31:
      show = "Hungarian";
      break;
    case 32:
      show = "Spanish National";
      break;
    case 33:
      show = "Slovak";
      break;
    case 34:
      show = "Czech";
      break;
    case 35:
      show = "Polish";
      break;
    case 36:
      show = "Romanian";
      break;
    case 38:
      show = "SCS";
      break;
    case 39:
      show = "Russian";
      break;
    case 40:
      show = "Latin American";
      break;
    default:
      show = "unknown";
    }
  }
  show_result("%s", show);
  save = pos;
  code = scan_any(report, &pos, 'n');
  if (save != pos) {
    vt_move(5, 10);
    switch (code) {
    case 0:
      show = "keyboard ready";
      break;
    case 3:
      show = "no keyboard";
      break;
    case 8:
      show = "keyboard busy";
      break;
    default:
      show = "unknown keyboard status";
    }
    show_result("%s", show);
    vt_move(6, 10);
    switch (scan_any(report, &pos, 'n')) {
    case 0:
      show = "LK201";
      break;
    case 1:
      show = "LK401";
      break;
    default:
      show = "unknown keyboard type";
    }
    show_result("%s", show);
  }
}
```