user: 下面的汇编指令对应的C源代码是什么：

```asm
<command_dispatcher>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  lea    -0xf4000(%rsp),%r11
L309:
  sub    $0x1000,%rsp
  orq    $0x0,(%rsp)
  cmp    %r11,%rsp
  jne    L309
  sub    $0x290,%rsp
  mov    %rdi,-0xf4288(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    -0xf425a(%rbp),%rdx
  mov    -0xf4288(%rbp),%rax
  lea    D118(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,-0xf427c(%rbp)
  cmpl   $0x0,-0xf427c(%rbp)
  jle    L209
  lea    -0xf425a(%rbp),%rax
  lea    D171(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L7
  mov    $0x0,%eax
  call   <quit_command@plt>
  jmp    L306
L7:
  lea    -0xf425a(%rbp),%rax
  lea    D134(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L320
  movl   $0x0,-0xf4260(%rbp)
  lea    -0xf4250(%rbp),%rcx
  lea    -0xf425a(%rbp),%rdx
  mov    -0xf4288(%rbp),%rax
  lea    D178(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,-0xf4260(%rbp)
  cmpl   $0x1,-0xf4260(%rbp)
  jg     L314
  lea    D199(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L306
L314:
  lea    -0xf4250(%rbp),%rax
  mov    %rax,%rdi
  call   <mount_command@plt>
  jmp    L306
L320:
  lea    -0xf425a(%rbp),%rax
  lea    D190(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L239
  lea    -0xf4250(%rbp),%rcx
  lea    -0xf425a(%rbp),%rdx
  mov    -0xf4288(%rbp),%rax
  lea    D178(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,-0xf4264(%rbp)
  cmpl   $0x1,-0xf4264(%rbp)
  jg     L205
  lea    D196(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L306
L205:
  lea    -0xf4250(%rbp),%rax
  mov    %rax,%rdi
  call   <ls_command@plt>
  jmp    L306
L239:
  lea    -0xf425a(%rbp),%rax
  lea    D29(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L319
  lea    -0xf427d(%rbp),%rcx
  lea    -0xf425a(%rbp),%rdx
  mov    -0xf4288(%rbp),%rax
  lea    D166(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,-0xf4268(%rbp)
  cmpl   $0x1,-0xf4268(%rbp)
  jg     L234
  lea    D243(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L306
L234:
  movzbl -0xf427d(%rbp),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <chain_command@plt>
  jmp    L306
L319:
  lea    -0xf425a(%rbp),%rax
  lea    D247(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L165
  mov    $0x0,%eax
  call   <fat_command@plt>
  jmp    L306
L165:
  lea    -0xf425a(%rbp),%rax
  lea    D125(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L343
  lea    -0xf4250(%rbp),%rcx
  lea    -0xf425a(%rbp),%rdx
  mov    -0xf4288(%rbp),%rax
  lea    D178(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,-0xf426c(%rbp)
  cmpl   $0x1,-0xf426c(%rbp)
  jg     L285
  lea    D91(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L306
L285:
  lea    -0xf4250(%rbp),%rax
  mov    %rax,%rdi
  call   <dump_fat_command@plt>
  jmp    L306
L343:
  lea    -0xf425a(%rbp),%rax
  lea    D240(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L318
  lea    -0xf4250(%rbp),%rcx
  lea    -0xf425a(%rbp),%rdx
  mov    -0xf4288(%rbp),%rax
  lea    D178(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,-0xf4270(%rbp)
  cmpl   $0x1,-0xf4270(%rbp)
  jg     L1
  lea    D211(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L306
L1:
  lea    -0xf4250(%rbp),%rax
  mov    %rax,%rdi
  call   <dump_command@plt>
  jmp    L306
L318:
  lea    -0xf425a(%rbp),%rax
  lea    D224(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L226
  lea    -0xf4250(%rbp),%rcx
  lea    -0xf425a(%rbp),%rdx
  mov    -0xf4288(%rbp),%rax
  lea    D178(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,-0xf4274(%rbp)
  cmpl   $0x1,-0xf4274(%rbp)
  jg     L274
  lea    D121(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L306
L274:
  lea    -0xf4250(%rbp),%rax
  mov    %rax,%rdi
  call   <hdump_command@plt>
  jmp    L306
L226:
  lea    -0xf425a(%rbp),%rax
  lea    D230(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L51
  mov    $0x0,%eax
  call   <info_command@plt>
  jmp    L306
L51:
  lea    -0xf425a(%rbp),%rax
  lea    D153(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L137
  lea    -0xf427d(%rbp),%rcx
  lea    -0xf425a(%rbp),%rdx
  mov    -0xf4288(%rbp),%rax
  lea    D98(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    %eax,-0xf4278(%rbp)
  cmpl   $0x1,-0xf4278(%rbp)
  jg     L35
  lea    D189(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L306
L35:
  movzbl -0xf427d(%rbp),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <show_command@plt>
  jmp    L306
L137:
  lea    D220(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L306
L209:
  nop
L306:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L243
  call   <__stack_chk_fail@plt>
L243:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: label: D118
datatype: string
name: retrieve_data
arguments: label: D171
datatype: string
name: retrieve_data
arguments: label: D134
datatype: string
name: retrieve_data
arguments: label: D178
datatype: string
name: retrieve_data
arguments: label: D199
datatype: string
name: retrieve_data
arguments: label: D190
datatype: string
name: retrieve_data
arguments: label: D196
datatype: string
name: retrieve_data
arguments: label: D29
datatype: string
name: retrieve_data
arguments: label: D166
datatype: string
name: retrieve_data
arguments: label: D243
datatype: string
name: retrieve_data
arguments: label: D247
datatype: string
name: retrieve_data
arguments: label: D125
datatype: string
name: retrieve_data
arguments: label: D91
datatype: string
name: retrieve_data
arguments: label: D240
datatype: string
name: retrieve_data
arguments: label: D211
datatype: string
name: retrieve_data
arguments: label: D224
datatype: string
name: retrieve_data
arguments: label: D121
datatype: string
name: retrieve_data
arguments: label: D230
datatype: string
name: retrieve_data
arguments: label: D153
datatype: string
name: retrieve_data
arguments: label: D98
datatype: string
name: retrieve_data
arguments: label: D189
datatype: string
name: retrieve_data
arguments: label: D220
datatype: string

tool: D118: %s

tool: D171: quit

tool: D134: mount

tool: D178: %s %s

tool: D199: mount mount-device


tool: D190: ls

tool: D196: ls directory


tool: D29: chain

tool: D166: %s %hu

tool: D243: chain cluster-number


tool: D247: fat

tool: D125: dump_fat

tool: D91: dump_fat file-path


tool: D240: dump

tool: D211: dump file-name

tool: D224: hdump

tool: D121: hdump file-name

tool: D230: info

tool: D153: show

tool: D98: %s %c

tool: D189: show w|c


tool: D220: 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");
  }
}
```