user: 请将这段汇编代码片段转换成等效的C代码:

```asm
<command_dispatcher>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  lea    -0xf4000(%rsp),%r11
L54:
  sub    $0x1000,%rsp
  orq    $0x0,(%rsp)
  cmp    %r11,%rsp
  jne    L54
  sub    $0x2b0,%rsp
  mov    %rdi,-0xf42a8(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    -0xf425a(%rbp),%rdx
  mov    -0xf42a8(%rbp),%rax
  lea    D417(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,-0xf4294(%rbp)
  cmpl   $0x0,-0xf4294(%rbp)
  jle    L99
  lea    -0xf425a(%rbp),%rax
  lea    D333(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L589
  mov    $0x0,%eax
  call   <quit_command@plt>
  jmp    L476
L589:
  lea    -0xf425a(%rbp),%rax
  lea    D334(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L183
  movl   $0x0,-0xf4260(%rbp)
  lea    -0xf4250(%rbp),%rcx
  lea    -0xf425a(%rbp),%rdx
  mov    -0xf42a8(%rbp),%rax
  lea    D406(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,-0xf4260(%rbp)
  cmpl   $0x1,-0xf4260(%rbp)
  jg     L182
  lea    D196(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L476
L182:
  lea    -0xf4250(%rbp),%rax
  mov    %rax,%rdi
  call   <mount_command@plt>
  jmp    L476
L183:
  lea    -0xf425a(%rbp),%rax
  lea    D86(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L166
  movl   $0x0,-0xf4264(%rbp)
  lea    -0xf4250(%rbp),%rcx
  lea    -0xf425a(%rbp),%rdx
  mov    -0xf42a8(%rbp),%rax
  lea    D406(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,-0xf4264(%rbp)
  cmpl   $0x1,-0xf4264(%rbp)
  jg     L215
  lea    D360(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L476
L215:
  lea    -0xf4250(%rbp),%rax
  mov    %rax,%rdi
  call   <wmount_command@plt>
  jmp    L476
L166:
  lea    -0xf425a(%rbp),%rax
  lea    D267(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L26
  mov    $0x0,%eax
  call   <umount_command@plt>
  jmp    L476
L26:
  lea    -0xf425a(%rbp),%rax
  lea    D335(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L301
  lea    -0xf4250(%rbp),%rcx
  lea    -0xf425a(%rbp),%rdx
  mov    -0xf42a8(%rbp),%rax
  lea    D406(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,-0xf4268(%rbp)
  cmpl   $0x1,-0xf4268(%rbp)
  jle    L386
  lea    -0xf4250(%rbp),%rax
  mov    %rax,%rdi
  call   <cd_command@plt>
  jmp    L476
L301:
  lea    -0xf425a(%rbp),%rax
  lea    D262(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L74
  lea    -0xf4250(%rbp),%rcx
  lea    -0xf425a(%rbp),%rdx
  mov    -0xf42a8(%rbp),%rax
  lea    D406(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,-0xf426c(%rbp)
  cmpl   $0x1,-0xf426c(%rbp)
  jg     L16
  mov    $0x0,%edi
  call   <ls_command@plt>
  jmp    L476
L16:
  lea    -0xf4250(%rbp),%rax
  mov    %rax,%rdi
  call   <ls_command@plt>
  jmp    L476
L74:
  lea    -0xf425a(%rbp),%rax
  lea    D238(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L20
  lea    -0xf4250(%rbp),%rcx
  lea    -0xf425a(%rbp),%rdx
  mov    -0xf42a8(%rbp),%rax
  lea    D406(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,-0xf4270(%rbp)
  cmpl   $0x1,-0xf4270(%rbp)
  jg     L527
  mov    $0x0,%edi
  call   <lsdel_command@plt>
  jmp    L476
L527:
  lea    -0xf4250(%rbp),%rax
  mov    %rax,%rdi
  call   <lsdel_command@plt>
  jmp    L476
L20:
  lea    -0xf425a(%rbp),%rax
  lea    D236(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L388
  lea    -0xf4295(%rbp),%rcx
  lea    -0xf425a(%rbp),%rdx
  mov    -0xf42a8(%rbp),%rax
  lea    D220(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,-0xf4274(%rbp)
  cmpl   $0x1,-0xf4274(%rbp)
  jg     L510
  lea    D275(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L476
L510:
  movzbl -0xf4295(%rbp),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <chain_command@plt>
  jmp    L476
L388:
  lea    -0xf425a(%rbp),%rax
  lea    D280(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L579
  mov    $0x0,%eax
  call   <fat_command@plt>
  jmp    L476
L579:
  lea    -0xf425a(%rbp),%rax
  lea    D31(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L411
  lea    -0xf4250(%rbp),%rcx
  lea    -0xf425a(%rbp),%rdx
  mov    -0xf42a8(%rbp),%rax
  lea    D406(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,-0xf4278(%rbp)
  cmpl   $0x1,-0xf4278(%rbp)
  jg     L243
  lea    D64(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L476
L243:
  lea    -0xf4250(%rbp),%rax
  mov    %rax,%rdi
  call   <dump_fat_command@plt>
  jmp    L476
L411:
  lea    -0xf425a(%rbp),%rax
  lea    D255(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L78
  lea    -0xf4250(%rbp),%rcx
  lea    -0xf425a(%rbp),%rdx
  mov    -0xf42a8(%rbp),%rax
  lea    D406(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,-0xf427c(%rbp)
  cmpl   $0x1,-0xf427c(%rbp)
  jg     L163
  lea    D260(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L476
L163:
  lea    -0xf4250(%rbp),%rax
  mov    %rax,%rdi
  call   <dump_command@plt>
  jmp    L476
L78:
  lea    -0xf425a(%rbp),%rax
  lea    D231(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L168
  lea    -0xf4250(%rbp),%rcx
  lea    -0xf425a(%rbp),%rdx
  mov    -0xf42a8(%rbp),%rax
  lea    D406(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,-0xf4280(%rbp)
  cmpl   $0x1,-0xf4280(%rbp)
  jg     L506
  lea    D91(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L476
L506:
  lea    -0xf4250(%rbp),%rax
  mov    %rax,%rdi
  call   <hdump_command@plt>
  jmp    L476
L168:
  lea    -0xf425a(%rbp),%rax
  lea    D81(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L220
  lea    -0xf4250(%rbp),%rcx
  lea    -0xf425a(%rbp),%rdx
  mov    -0xf42a8(%rbp),%rax
  lea    D406(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,-0xf4284(%rbp)
  cmpl   $0x1,-0xf4284(%rbp)
  jg     L132
  lea    D248(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L476
L132:
  lea    -0xf4250(%rbp),%rax
  mov    %rax,%rdi
  call   <delete_command@plt>
  jmp    L476
L220:
  lea    -0xf425a(%rbp),%rax
  lea    D125(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L170
  lea    -0xf4250(%rbp),%rcx
  lea    -0xf425a(%rbp),%rdx
  mov    -0xf42a8(%rbp),%rax
  lea    D406(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,-0xf4288(%rbp)
  cmpl   $0x1,-0xf4288(%rbp)
  jg     L242
  lea    D93(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L476
L242:
  lea    -0xf4250(%rbp),%rax
  mov    %rax,%rdi
  call   <undelete_command@plt>
  jmp    L476
L170:
  lea    -0xf425a(%rbp),%rax
  lea    D88(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L62
  mov    $0x0,%eax
  call   <info_command@plt>
  jmp    L476
L62:
  lea    -0xf425a(%rbp),%rax
  lea    D79(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L626
  lea    -0xf4295(%rbp),%rcx
  lea    -0xf425a(%rbp),%rdx
  mov    -0xf42a8(%rbp),%rax
  lea    D153(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,-0xf428c(%rbp)
  cmpl   $0x1,-0xf428c(%rbp)
  jg     L281
  lea    D375(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L476
L281:
  movzbl -0xf4295(%rbp),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <show_command@plt>
  jmp    L476
L626:
  lea    -0xf425a(%rbp),%rax
  lea    D66(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L409
  mov    $0x0,%eax
  call   <test_fat_command@plt>
  jmp    L476
L409:
  lea    -0xf425a(%rbp),%rax
  lea    D170(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L192
  lea    -0xf4295(%rbp),%rcx
  lea    -0xf425a(%rbp),%rdx
  mov    -0xf42a8(%rbp),%rax
  lea    D220(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,-0xf4290(%rbp)
  cmpl   $0x1,-0xf4290(%rbp)
  jg     L83
  lea    D315(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L476
L83:
  movzbl -0xf4295(%rbp),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <test_command@plt>
  jmp    L476
L192:
  lea    D424(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L476
L99:
  nop
  jmp    L476
L386:
  nop
L476:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L570
  call   <__stack_chk_fail@plt>
L570:
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_tag: D417
data_type: string
name: parse_data
arguments: data_tag: D333
data_type: string
name: parse_data
arguments: data_tag: D334
data_type: string
name: parse_data
arguments: data_tag: D406
data_type: string
name: parse_data
arguments: data_tag: D196
data_type: string
name: parse_data
arguments: data_tag: D86
data_type: string
name: parse_data
arguments: data_tag: D360
data_type: string
name: parse_data
arguments: data_tag: D267
data_type: string
name: parse_data
arguments: data_tag: D335
data_type: string
name: parse_data
arguments: data_tag: D262
data_type: string
name: parse_data
arguments: data_tag: D238
data_type: string
name: parse_data
arguments: data_tag: D236
data_type: string
name: parse_data
arguments: data_tag: D220
data_type: string
name: parse_data
arguments: data_tag: D275
data_type: string
name: parse_data
arguments: data_tag: D280
data_type: string
name: parse_data
arguments: data_tag: D31
data_type: string
name: parse_data
arguments: data_tag: D64
data_type: string
name: parse_data
arguments: data_tag: D255
data_type: string
name: parse_data
arguments: data_tag: D260
data_type: string
name: parse_data
arguments: data_tag: D231
data_type: string
name: parse_data
arguments: data_tag: D91
data_type: string
name: parse_data
arguments: data_tag: D81
data_type: string
name: parse_data
arguments: data_tag: D248
data_type: string
name: parse_data
arguments: data_tag: D125
data_type: string
name: parse_data
arguments: data_tag: D93
data_type: string
name: parse_data
arguments: data_tag: D88
data_type: string
name: parse_data
arguments: data_tag: D79
data_type: string
name: parse_data
arguments: data_tag: D153
data_type: string
name: parse_data
arguments: data_tag: D375
data_type: string
name: parse_data
arguments: data_tag: D66
data_type: string
name: parse_data
arguments: data_tag: D170
data_type: string
name: parse_data
arguments: data_tag: D315
data_type: string
name: parse_data
arguments: data_tag: D424
data_type: string

tool: D417: %s

tool: D333: quit

tool: D334: mount

tool: D406: %s %s

tool: D196: mount mount-device


tool: D86: wmount

tool: D360: wmount mount-device


tool: D267: umount

tool: D335: cd

tool: D262: ls

tool: D238: lsdel

tool: D236: chain

tool: D220: %s %u

tool: D275: chain cluster-number


tool: D280: fat

tool: D31: dump_fat

tool: D64: dump_fat file-path


tool: D255: dump

tool: D260: dump file-name

tool: D231: hdump

tool: D91: hdump file-name

tool: D81: delete

tool: D248: delete file-name

tool: D125: undelete

tool: D93: undelete file-name

tool: D88: info

tool: D79: show

tool: D153: %s %c

tool: D375: show w|c


tool: D66: test_fat

tool: D170: test

tool: D315: test cluster-number


tool: D424: 404 Not Found


assistant: ```c
void command_dispatcher(const char *command) {
  char verb[10];
  int len;
  len = sscanf(command, "%s", verb);
  if (len < 1)
    return;
  if (!strcmp(verb, "quit")) {
    quit_command();
  } else if (!strcmp(verb, "mount")) {
    char dev[(1000 * 1000)];
    int len = 0;
    len = sscanf(command, "%s %s", verb, dev);
    if (len < 2) {
      printf("mount mount-device\n");
      return;
    }
    mount_command(dev);
  } else if (!strcmp(verb, "wmount")) {
    char dev[(1000 * 1000)];
    int len = 0;
    len = sscanf(command, "%s %s", verb, dev);
    if (len < 2) {
      printf("wmount mount-device\n");
      return;
    }
    wmount_command(dev);
  } else if (!strcmp(verb, "umount")) {
    umount_command();
  } else if (!strcmp(verb, "cd")) {
    char path[(1000 * 1000)];
    int len;
    len = sscanf(command, "%s %s", verb, path);
    if (len < 2) {
      return;
    }
    cd_command(path);
  } else if (!strcmp(verb, "ls")) {
    char dir[(1000 * 1000)];
    int len;
    len = sscanf(command, "%s %s", verb, dir);
    if (len < 2) {
      ls_command(NULL);
      return;
    }
    ls_command(dir);
  } else if (!strcmp(verb, "lsdel")) {
    char dir[(1000 * 1000)];
    int len;
    len = sscanf(command, "%s %s", verb, dir);
    if (len < 2) {
      lsdel_command(NULL);
      return;
    }
    lsdel_command(dir);
  } else if (!strcmp(verb, "chain")) {
    uint32_t index;
    int len;
    len = sscanf(command, "%s %u", verb, &index);
    if (len < 2) {
      printf("chain cluster-number\n");
      return;
    }
    chain_command(index);
  } else if (!strcmp(verb, "fat")) {
    fat_command();
  } else if (!strcmp(verb, "dump_fat")) {
    char path[(1000 * 1000)];
    int len;
    len = sscanf(command, "%s %s", verb, path);
    if (len < 2) {
      printf("dump_fat file-path\n");
      return;
    }
    dump_fat_command(path);
  } else if (!strcmp(verb, "dump")) {
    char dir[(1000 * 1000)];
    int len;
    len = sscanf(command, "%s %s", verb, dir);
    if (len < 2) {
      printf("dump file-name");
      return;
    }
    dump_command(dir);
  } else if (!strcmp(verb, "hdump")) {
    char dir[(1000 * 1000)];
    int len;
    len = sscanf(command, "%s %s", verb, dir);
    if (len < 2) {
      printf("hdump file-name");
      return;
    }
    hdump_command(dir);
  } else if (!strcmp(verb, "delete")) {
    char dir[(1000 * 1000)];
    int len;
    len = sscanf(command, "%s %s", verb, dir);
    if (len < 2) {
      printf("delete file-name");
      return;
    }
    delete_command(dir);
  } else if (!strcmp(verb, "undelete")) {
    char dir[(1000 * 1000)];
    int len;
    len = sscanf(command, "%s %s", verb, dir);
    if (len < 2) {
      printf("undelete file-name");
      return;
    }
    undelete_command(dir);
  } else if (!strcmp(verb, "info")) {
    info_command();
  } else if (!strcmp(verb, "show")) {
    char c;
    int len;
    len = sscanf(command, "%s %c", verb, &c);
    if (len < 2) {
      printf("show w|c\n");
      return;
    }
    show_command(c);
  } else if (!strcmp(verb, "test_fat")) {
    test_fat_command();
  } else if (!strcmp(verb, "test")) {
    uint32_t index;
    int len;
    len = sscanf(command, "%s %u", verb, &index);
    if (len < 2) {
      printf("test cluster-number\n");
      return;
    }
    test_command(index);
  } else {
    printf("404 Not Found\n");
  }
}
```