user: Translate the below assembly code into C programming language:

```asm
<command_dispatcher>:
  endbr64
  push   %rbx
  lea    -0xf4000(%rsp),%r11
L323:
  sub    $0x1000,%rsp
  orq    $0x0,(%rsp)
  cmp    %r11,%rsp
  jne    L323
  sub    $0x260,%rsp
  mov    %rdi,%rbx
  mov    %fs:0x28,%rax
  mov    %rax,0xf4258(%rsp)
  xor    %eax,%eax
  lea    0x6(%rsp),%rdx
  lea    D149(%rip),%rsi
  call   <sscanf@plt>
  test   %eax,%eax
  jle    L150
  lea    0x6(%rsp),%rdi
  lea    D169(%rip),%rsi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L308
  lea    0x6(%rsp),%rdi
  lea    D1(%rip),%rsi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L287
  lea    0x6(%rsp),%rdi
  lea    D56(%rip),%rsi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L74
  lea    0x6(%rsp),%rdi
  lea    D35(%rip),%rsi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L133
  lea    0x6(%rsp),%rdi
  lea    D6(%rip),%rsi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L246
  lea    0x6(%rsp),%rdi
  lea    D15(%rip),%rsi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L118
  lea    0x6(%rsp),%rdi
  lea    D74(%rip),%rsi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L38
  lea    0x6(%rsp),%rdi
  lea    D116(%rip),%rsi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L124
  lea    0x6(%rsp),%rdi
  lea    D62(%rip),%rsi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L258
  lea    0x6(%rsp),%rdi
  lea    D241(%rip),%rsi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L351
  lea    0x5(%rsp),%rcx
  lea    0x6(%rsp),%rdx
  lea    D36(%rip),%rsi
  mov    %rbx,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L341
  movsbl 0x5(%rsp),%edi
  call   <show_command@plt>
  jmp    L150
L308:
  call   <quit_command@plt>
L150:
  mov    0xf4258(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L345
  add    $0xf4260,%rsp
  pop    %rbx
  ret
L287:
  lea    0x10(%rsp),%rcx
  lea    0x6(%rsp),%rdx
  lea    D11(%rip),%rsi
  mov    %rbx,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L269
  lea    0x10(%rsp),%rdi
  call   <mount_command@plt>
  jmp    L150
L269:
  lea    D92(%rip),%rdi
  call   <printf@plt>
  jmp    L150
L74:
  lea    0x10(%rsp),%rcx
  lea    0x6(%rsp),%rdx
  lea    D11(%rip),%rsi
  mov    %rbx,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L219
  lea    0x10(%rsp),%rdi
  call   <ls_command@plt>
  jmp    L150
L219:
  lea    D77(%rip),%rdi
  call   <printf@plt>
  jmp    L150
L133:
  lea    0x5(%rsp),%rcx
  lea    0x6(%rsp),%rdx
  lea    D95(%rip),%rsi
  mov    %rbx,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L270
  movsbl 0x5(%rsp),%edi
  call   <chain_command@plt>
  jmp    L150
L270:
  lea    D38(%rip),%rdi
  call   <printf@plt>
  jmp    L150
L246:
  call   <fat_command@plt>
  jmp    L150
L118:
  lea    0x10(%rsp),%rcx
  lea    0x6(%rsp),%rdx
  lea    D11(%rip),%rsi
  mov    %rbx,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L46
  lea    0x10(%rsp),%rdi
  call   <dump_fat_command@plt>
  jmp    L150
L46:
  lea    D105(%rip),%rdi
  call   <printf@plt>
  jmp    L150
L38:
  lea    0x10(%rsp),%rcx
  lea    0x6(%rsp),%rdx
  lea    D11(%rip),%rsi
  mov    %rbx,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L332
  lea    0x10(%rsp),%rdi
  call   <dump_command@plt>
  jmp    L150
L332:
  lea    D235(%rip),%rdi
  call   <printf@plt>
  jmp    L150
L124:
  lea    0x10(%rsp),%rcx
  lea    0x6(%rsp),%rdx
  lea    D11(%rip),%rsi
  mov    %rbx,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jle    L194
  lea    0x10(%rsp),%rdi
  call   <hdump_command@plt>
  jmp    L150
L194:
  lea    D59(%rip),%rdi
  call   <printf@plt>
  jmp    L150
L258:
  call   <info_command@plt>
  jmp    L150
L341:
  lea    D39(%rip),%rdi
  call   <printf@plt>
  jmp    L150
L351:
  lea    D174(%rip),%rdi
  call   <printf@plt>
  jmp    L150
L345:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: read_data
arguments: tag: D149
data_type: string
name: read_data
arguments: tag: D169
data_type: string
name: read_data
arguments: tag: D1
data_type: string
name: read_data
arguments: tag: D56
data_type: string
name: read_data
arguments: tag: D35
data_type: string
name: read_data
arguments: tag: D6
data_type: string
name: read_data
arguments: tag: D15
data_type: string
name: read_data
arguments: tag: D74
data_type: string
name: read_data
arguments: tag: D116
data_type: string
name: read_data
arguments: tag: D62
data_type: string
name: read_data
arguments: tag: D241
data_type: string
name: read_data
arguments: tag: D36
data_type: string
name: read_data
arguments: tag: D11
data_type: string
name: read_data
arguments: tag: D92
data_type: string
name: read_data
arguments: tag: D77
data_type: string
name: read_data
arguments: tag: D95
data_type: string
name: read_data
arguments: tag: D38
data_type: string
name: read_data
arguments: tag: D105
data_type: string
name: read_data
arguments: tag: D235
data_type: string
name: read_data
arguments: tag: D59
data_type: string
name: read_data
arguments: tag: D39
data_type: string
name: read_data
arguments: tag: D174
data_type: string

tool: D149: %s

tool: D169: quit

tool: D1: mount

tool: D56: ls

tool: D35: chain

tool: D6: fat

tool: D15: dump_fat

tool: D74: dump

tool: D116: hdump

tool: D62: info

tool: D241: show

tool: D36: %s %c

tool: D11: %s %s

tool: D92: mount mount-device


tool: D77: ls directory


tool: D95: %s %hu

tool: D38: chain cluster-number


tool: D105: dump_fat file-path


tool: D235: dump file-name

tool: D59: hdump file-name

tool: D39: show w|c


tool: D174: 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, "ls")) {
    char dir[(1000 * 1000)];
    int len;
    len = sscanf(command, "%s %s", verb, dir);
    if (len < 2) {
      printf("ls directory\n");
      return;
    }
    ls_command(dir);
  } else if (!strcmp(verb, "chain")) {
    uint16_t index;
    int len;
    len = sscanf(command, "%s %hu", 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, "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 {
    printf("404 Not Found\n");
  }
}
```