user: 请将以下的汇编代码转换成C语言代码:

```asm
<cmd_14>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x360,%rsp
  mov    %edi,-0x354(%rbp)
  mov    %rsi,-0x360(%rbp)
  mov    %edx,-0x358(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x14,-0x344(%rbp)
  movl   $0x14,-0x2e0(%rbp)
  movl   $0x6c,-0x2dc(%rbp)
  movl   $0x6f,-0x2d8(%rbp)
  movl   $0x20,-0x2d4(%rbp)
  movl   $0x33,-0x2d0(%rbp)
  movl   $0x31,-0x2cc(%rbp)
  movl   $0x34,-0x2c8(%rbp)
  movl   $0x35,-0x2c4(%rbp)
  movl   $0x14,-0x2c0(%rbp)
  movl   $0x52,-0x2bc(%rbp)
  movl   $0x45,-0x2b8(%rbp)
  movl   $0x20,-0x2b4(%rbp)
  movl   $0x50,-0x2b0(%rbp)
  movl   $0x43,-0x2ac(%rbp)
  movl   $0x5f,-0x2a8(%rbp)
  movl   $0x43,-0x2a4(%rbp)
  movl   $0x42,-0x2a0(%rbp)
  movl   $0x55,-0x29c(%rbp)
  movl   $0x46,-0x298(%rbp)
  movl   $0x14,-0x250(%rbp)
  movl   $0x77,-0x24c(%rbp)
  movl   $0x72,-0x248(%rbp)
  movl   $0x20,-0x244(%rbp)
  movl   $0x50,-0x240(%rbp)
  movl   $0x43,-0x23c(%rbp)
  movl   $0x5f,-0x238(%rbp)
  movl   $0x43,-0x234(%rbp)
  movl   $0x42,-0x230(%rbp)
  movl   $0x55,-0x22c(%rbp)
  movl   $0x46,-0x228(%rbp)
  movl   $0x2f,-0x224(%rbp)
  movl   $0x30,-0x220(%rbp)
  movl   $0x20,-0x21c(%rbp)
  movl   $0x30,-0x218(%rbp)
  movl   $0x14,-0x210(%rbp)
  movl   $0x77,-0x20c(%rbp)
  movl   $0x72,-0x208(%rbp)
  movl   $0x20,-0x204(%rbp)
  movl   $0x50,-0x200(%rbp)
  movl   $0x43,-0x1fc(%rbp)
  movl   $0x5f,-0x1f8(%rbp)
  movl   $0x43,-0x1f4(%rbp)
  movl   $0x42,-0x1f0(%rbp)
  movl   $0x55,-0x1ec(%rbp)
  movl   $0x46,-0x1e8(%rbp)
  movl   $0x2f,-0x1e4(%rbp)
  movl   $0x30,-0x1e0(%rbp)
  movl   $0x20,-0x1dc(%rbp)
  movl   $0x31,-0x1d8(%rbp)
  movl   $0x14,-0x150(%rbp)
  movl   $0x77,-0x14c(%rbp)
  movl   $0x72,-0x148(%rbp)
  movl   $0x20,-0x144(%rbp)
  movl   $0x50,-0x140(%rbp)
  movl   $0x43,-0x13c(%rbp)
  movl   $0x5f,-0x138(%rbp)
  movl   $0x43,-0x134(%rbp)
  movl   $0x42,-0x130(%rbp)
  movl   $0x55,-0x12c(%rbp)
  movl   $0x46,-0x128(%rbp)
  movl   $0x2f,-0x124(%rbp)
  movl   $0x31,-0x120(%rbp)
  movl   $0x20,-0x11c(%rbp)
  movl   $0x31,-0x118(%rbp)
  movl   $0x35,-0x114(%rbp)
  movl   $0x14,-0x1d0(%rbp)
  movl   $0x77,-0x1cc(%rbp)
  movl   $0x72,-0x1c8(%rbp)
  movl   $0x20,-0x1c4(%rbp)
  movl   $0x50,-0x1c0(%rbp)
  movl   $0x43,-0x1bc(%rbp)
  movl   $0x5f,-0x1b8(%rbp)
  movl   $0x43,-0x1b4(%rbp)
  movl   $0x42,-0x1b0(%rbp)
  movl   $0x55,-0x1ac(%rbp)
  movl   $0x46,-0x1a8(%rbp)
  movl   $0x2f,-0x1a4(%rbp)
  movl   $0x31,-0x1a0(%rbp)
  movl   $0x20,-0x19c(%rbp)
  movl   $0x30,-0x198(%rbp)
  movl   $0x14,-0x190(%rbp)
  movl   $0x77,-0x18c(%rbp)
  movl   $0x72,-0x188(%rbp)
  movl   $0x20,-0x184(%rbp)
  movl   $0x49,-0x180(%rbp)
  movl   $0x50,-0x17c(%rbp)
  movl   $0x41,-0x178(%rbp)
  movl   $0x52,-0x174(%rbp)
  movl   $0x2f,-0x170(%rbp)
  movl   $0x30,-0x16c(%rbp)
  movl   $0x2d,-0x168(%rbp)
  movl   $0x39,-0x164(%rbp)
  movl   $0x35,-0x160(%rbp)
  movl   $0x20,-0x15c(%rbp)
  movl   $0x30,-0x158(%rbp)
  movl   $0x14,-0x290(%rbp)
  movl   $0x77,-0x28c(%rbp)
  movl   $0x72,-0x288(%rbp)
  movl   $0x20,-0x284(%rbp)
  movl   $0x49,-0x280(%rbp)
  movl   $0x50,-0x27c(%rbp)
  movl   $0x42,-0x278(%rbp)
  movl   $0x2f,-0x274(%rbp)
  movl   $0x30,-0x270(%rbp)
  movl   $0x2d,-0x26c(%rbp)
  movl   $0x39,-0x268(%rbp)
  movl   $0x35,-0x264(%rbp)
  movl   $0x20,-0x260(%rbp)
  movl   $0x30,-0x25c(%rbp)
  movl   $0xaa,-0x340(%rbp)
  movl   $0x80,-0x33c(%rbp)
  movl   $0x4,-0x338(%rbp)
  movl   $0xe8,-0x334(%rbp)
  movl   $0x42,-0x330(%rbp)
  movl   $0xaa,-0x320(%rbp)
  movl   $0xc0,-0x31c(%rbp)
  movl   $0x2,-0x318(%rbp)
  movl   $0x38,-0x314(%rbp)
  movl   $0x5d,-0x310(%rbp)
  movl   $0xaa,-0x300(%rbp)
  movl   $0x40,-0x2fc(%rbp)
  movl   $0x0,-0x2f8(%rbp)
  movl   $0xe6,-0x2f4(%rbp)
  movl   $0x3e,-0x2f0(%rbp)
  subl   $0x2,-0x358(%rbp)
  cmpl   $0x1,-0x358(%rbp)
  jne    L140
  lea    -0x344(%rbp),%rcx
  mov    -0x360(%rbp),%rax
  mov    $0x1,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <cmdcmp@plt>
  test   %rax,%rax
  jne    L140
  lea    D13(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  jmp    L209
L140:
  cmpl   $0x8,-0x358(%rbp)
  jne    L63
  lea    -0x2e0(%rbp),%rcx
  mov    -0x360(%rbp),%rax
  mov    $0x8,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <cmdcmp@plt>
  test   %rax,%rax
  jne    L63
  lea    D9(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    -0x300(%rbp),%rcx
  mov    -0x354(%rbp),%eax
  mov    $0x5,%edx
  mov    %rcx,%rsi
  mov    %eax,%edi
  call   <writeportb@plt>
  jmp    L209
L63:
  cmpl   $0xb,-0x358(%rbp)
  jne    L172
  lea    -0x2c0(%rbp),%rcx
  mov    -0x360(%rbp),%rax
  mov    $0xb,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <cmdcmp@plt>
  test   %rax,%rax
  jne    L172
  lea    D57(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  jmp    L209
L172:
  cmpl   $0xf,-0x358(%rbp)
  jne    L108
  lea    -0x250(%rbp),%rcx
  mov    -0x360(%rbp),%rax
  mov    $0xf,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <cmdcmp@plt>
  test   %rax,%rax
  jne    L108
  lea    D66(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  jmp    L209
L108:
  cmpl   $0xf,-0x358(%rbp)
  jne    L146
  lea    -0x210(%rbp),%rcx
  mov    -0x360(%rbp),%rax
  mov    $0xf,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <cmdcmp@plt>
  test   %rax,%rax
  jne    L146
  lea    D40(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    -0x320(%rbp),%rcx
  mov    -0x354(%rbp),%eax
  mov    $0x5,%edx
  mov    %rcx,%rsi
  mov    %eax,%edi
  call   <writeportb@plt>
  jmp    L209
L146:
  cmpl   $0x10,-0x358(%rbp)
  jne    L1
  lea    -0x150(%rbp),%rcx
  mov    -0x360(%rbp),%rax
  mov    $0x10,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <cmdcmp@plt>
  test   %rax,%rax
  jne    L1
  lea    D62(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  jmp    L209
L1:
  lea    D5(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movl   $0x0,-0x348(%rbp)
  jmp    L62
L185:
  mov    -0x348(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x360(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cmp    $0x1f,%eax
  jle    L131
  mov    -0x348(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x360(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cmp    $0x7a,%eax
  jg     L131
  mov    -0x348(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x348(%rbp)
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x360(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,%esi
  lea    D94(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L62
L131:
  mov    -0x348(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x348(%rbp)
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x360(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,%esi
  lea    D47(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L62:
  mov    -0x348(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x360(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jne    L185
  mov    $0xa,%edi
  call   <putchar@plt>
  mov    -0x358(%rbp),%eax
  mov    %eax,%esi
  lea    D12(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L209:
  mov    $0x0,%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L28
  call   <__stack_chk_fail@plt>
L28:
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_label: D13
type: string
name: parse_data
arguments: data_label: D9
type: string
name: parse_data
arguments: data_label: D57
type: string
name: parse_data
arguments: data_label: D66
type: string
name: parse_data
arguments: data_label: D40
type: string
name: parse_data
arguments: data_label: D62
type: string
name: parse_data
arguments: data_label: D5
type: string
name: parse_data
arguments: data_label: D94
type: string
name: parse_data
arguments: data_label: D47
type: string
name: parse_data
arguments: data_label: D12
type: string

tool: D13: 0x14: Empty cmd. Something wrong?

tool: D9: 0x14: lo 3145

tool: D57: 0x14: cbf. About to shut down?

tool: D66: 0x14: cbf0. About to shut down?

tool: D40: 0x14: cbf1.

tool: D62: 0x14: cbf2. Don't know what to answer

tool: D5: > Unknown 0x14 command: 

tool: D94: '%c',

tool: D47: %i,

tool: D12: > size: %i


assistant: ```c
int cmd_14(int fd, int *f, int size) {
  int empty[] = {20};
  int lo_3145[] = {20, 'l', 'o', ' ', '3', '1', '4', '5'};
  int cbf[] = {20, 'R', 'E', ' ', 'P', 'C', '_', 'C', 'B', 'U', 'F'};
  int cbf0[] = {20, 'w', 'r', ' ', 'P', 'C', '_', 'C', 'B', 'U', 'F', '/', '0', ' ', '0'};
  int cbf1[] = {20, 'w', 'r', ' ', 'P', 'C', '_', 'C', 'B', 'U', 'F', '/', '0', ' ', '1'};
  int cbf2[] = {20, 'w', 'r', ' ', 'P', 'C', '_', 'C', 'B', 'U', 'F', '/', '1', ' ', '1', '5'};
  int cbf3[] = {20, 'w', 'r', ' ', 'P', 'C', '_', 'C', 'B', 'U', 'F', '/', '1', ' ', '0'};
  int ipar[] = {20, 'w', 'r', ' ', 'I', 'P', 'A', 'R', '/', '0', '-', '9', '5', ' ', '0'};
  int ipb[] = {20, 'w', 'r', ' ', 'I', 'P', 'B', '/', '0', '-', '9', '5', ' ', '0'};
  int answer1[] = {170, 128, 4, 232, 66};
  int answer2[] = {170, 192, 2, 56, 93};
  int busy[] = {170, 64, 0, 230, 62};
  unsigned char resp[255];
  size -= 2;
  if ((size == 1) && (cmdcmp(f, empty, 1) == 0)) {
    printf("0x14: Empty cmd. Something wrong?\n");
  } else if ((size == 8) && (cmdcmp(f, lo_3145, 8)) == 0) {
    printf("0x14: lo 3145\n");
    writeportb(fd, busy, 5);
  } else if ((size == 11) && (cmdcmp(f, cbf, 11) == 0)) {
    printf("0x14: cbf. About to shut down?\n");
  } else if ((size == 15) && (cmdcmp(f, cbf0, 15) == 0)) {
    printf("0x14: cbf0. About to shut down?\n");
  } else if ((size == 15) && (cmdcmp(f, cbf1, 15) == 0)) {
    printf("0x14: cbf1.\n");
    writeportb(fd, answer2, 5);
  } else if ((size == 16) && (cmdcmp(f, cbf2, 16) == 0)) {
    printf("0x14: cbf2. Don't know what to answer\n");
  } else {
    printf("> Unknown 0x14 command: ");
    int i = 0;
    while (f[i] != 0) {
      if ((f[i] >= 32) && (f[i] <= 122))
        printf("'%c',", f[i++]);
      else
        printf("%i,", f[i++]);
    }
    printf("\n");
    printf("> size: %i\n", size);
  }
  return 0;
}
```