user: 请从给定的汇编指令推导出C源代码:

```asm
<command_help>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x8(%rbp)
  mov    %rsi,-0x10(%rbp)
  mov    %rdx,-0x18(%rbp)
  mov    %ecx,-0x1c(%rbp)
  mov    -0x10(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  test   %rax,%rax
  je     L117
  mov    -0x10(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  lea    D117(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcasecmp@plt>
  test   %eax,%eax
  jne    L7
  lea    D44(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  jmp    L53
L7:
  mov    -0x10(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  lea    D70(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcasecmp@plt>
  test   %eax,%eax
  jne    L34
  lea    D66(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  jmp    L53
L34:
  mov    -0x10(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  lea    D76(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcasecmp@plt>
  test   %eax,%eax
  jne    L75
  lea    D92(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  jmp    L53
L75:
  mov    -0x10(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  lea    D124(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcasecmp@plt>
  test   %eax,%eax
  jne    L66
  lea    D46(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  jmp    L53
L66:
  mov    -0x10(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  lea    D69(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcasecmp@plt>
  test   %eax,%eax
  jne    L32
  lea    D25(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  jmp    L53
L32:
  mov    -0x10(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  lea    D54(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcasecmp@plt>
  test   %eax,%eax
  jne    L82
  lea    D37(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  jmp    L53
L82:
  mov    -0x10(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  mov    %rax,%rsi
  lea    D134(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  lea    D121(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  jmp    L53
L117:
  lea    D13(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
L53:
  leave
  ret
```

tool_calls: name: read_data
arguments: label: D117
type_infered: string
name: read_data
arguments: label: D44
type_infered: string
name: read_data
arguments: label: D70
type_infered: string
name: read_data
arguments: label: D66
type_infered: string
name: read_data
arguments: label: D76
type_infered: string
name: read_data
arguments: label: D92
type_infered: string
name: read_data
arguments: label: D124
type_infered: string
name: read_data
arguments: label: D46
type_infered: string
name: read_data
arguments: label: D69
type_infered: string
name: read_data
arguments: label: D25
type_infered: string
name: read_data
arguments: label: D54
type_infered: string
name: read_data
arguments: label: D37
type_infered: string
name: read_data
arguments: label: D134
type_infered: string
name: read_data
arguments: label: D121
type_infered: string
name: read_data
arguments: label: D13
type_infered: string

tool: D117: flat

tool: D44: FLAT is a very simple single piece of storage that can be read and
written as a whole.  It never changes its size.
Commands:
    flat open [path] [data]    -- open or create the database in <path>;
                                  if new, fill it with <data> (default:
                                  "Hello, World!")
    flat close                 -- close the currently open database
    flat remove [path]         -- remove the database file <path>
    flat write [data]	        -- write <data> into the flat database
    flat read [N]              -- read data (and dump N bytes)


tool: D70: help

tool: D66: To get more detailed help on a subject, type "help <subject>".
Subjects are:
    help   -- you're reading it
    flat   -- flat database commands
    istore -- indexed database commands
    gmap   -- map database commands
    time   -- monitoring execution time


tool: D76: istore

tool: D92: ISTORE is an indexed table of fixed- but variable-sized structures.
Commands:
    istore open [path]         -- open or create the database in <path>
    istore close               -- close the currently open database
    istore remove [path]       -- rm -rf the database files
    istore write [[N] size]    -- create 1 (or <N>) objects of size <size>
    istore read N [size]       -- access object #n (and print <size> bytes)
    istore next-id             -- print the next ID that would be allocated


tool: D124: gmap

tool: D46: GMAP maps indices to sets of indices.
Commands:
    gmap open [path]           -- open or create the database in <path>
    gmap close                 -- close the currently open database
    gmap remove [path]         -- rm -rf the database files
    gmap add N M               -- add <M> to the index set for <N>
    gmap read N                -- print the index set for <N>


tool: D69: time

tool: D25: A special "time" flag, if set, causes command execution times
to be printed along with the results.  It can be set interactively,
or from the addb command line with -t.
Commands:
    time                       -- print whether timing is on or off
    time now                   -- print current time
    time on                    -- start printing execution times
    time off                   -- stop printing execution times


tool: D54: quit

tool: D37: Quit.  It quits.


tool: D134: Sorry, no help on "%s"


tool: D121: Available: flat help istore time

tool: D13: Addb is a test client for libaddb.a, the attention deficit datab--OOH, SHINY!
For help on a command, use "help command".  Quickreference:
    help [command]       flat open [path [data]]    istore open [path]
    quit                 flat close                 istore close
    time                 flat remove [path]         istore remove [path]
    time [on / off]      flat read [nbytes]         istore read N [nbytes]
    time now             flat write data            istore write [[N] size]


assistant: ```c
void command_help(char const *progname, char const *const *argv, char const *filename, int line) {
  if (argv[1]) {
    if (!strcasecmp(argv[1], "flat"))
      puts("FLAT is a very simple single piece of storage that can be read and\n"
           "written as a whole.  It never changes its size.\n"
           "Commands:\n"
           "    flat open [path] [data]    -- open or create the database in "
           "<path>;\n"
           "                                  if new, fill it with <data> "
           "(default:\n"
           "                                  \"Hello, World!\")\n"
           "    flat close                 -- close the currently open "
           "database\n"
           "    flat remove [path]         -- remove the database file <path>\n"
           "    flat write [data]	        -- write <data> into the flat "
           "database\n"
           "    flat read [N]              -- read data (and dump N bytes)\n");
    else if (!strcasecmp(argv[1], "help"))
      puts("To get more detailed help on a subject, type \"help <subject>\".\n"
           "Subjects are:\n"
           "    help   -- you're reading it\n"
           "    flat   -- flat database commands\n"
           "    istore -- indexed database commands\n"
           "    gmap   -- map database commands\n"
           "    time   -- monitoring execution time\n");
    else if (!strcasecmp(argv[1], "istore"))
      puts("ISTORE is an indexed table of fixed- but variable-sized "
           "structures.\n"
           "Commands:\n"
           "    istore open [path]         -- open or create the database in "
           "<path>\n"
           "    istore close               -- close the currently open "
           "database\n"
           "    istore remove [path]       -- rm -rf the database files\n"
           "    istore write [[N] size]    -- create 1 (or <N>) objects of size "
           "<size>\n"
           "    istore read N [size]       -- access object #n (and print "
           "<size> bytes)\n"
           "    istore next-id             -- print the next ID that would be "
           "allocated\n");
    else if (!strcasecmp(argv[1], "gmap"))
      puts("GMAP maps indices to sets of indices.\n"
           "Commands:\n"
           "    gmap open [path]           -- open or create the database in "
           "<path>\n"
           "    gmap close                 -- close the currently open "
           "database\n"
           "    gmap remove [path]         -- rm -rf the database files\n"
           "    gmap add N M               -- add <M> to the index set for <N>\n"
           "    gmap read N                -- print the index set for <N>\n");
    else if (!strcasecmp(argv[1], "time"))
      puts("A special \"time\" flag, if set, causes command execution times\n"
           "to be printed along with the results.  It can be set "
           "interactively,\n"
           "or from the addb command line with -t.\n"
           "Commands:\n"
           "    time                       -- print whether timing is on or "
           "off\n"
           "    time now                   -- print current time\n"
           "    time on                    -- start printing execution times\n"
           "    time off                   -- stop printing execution times\n");
    else if (!strcasecmp(argv[1], "quit"))
      puts("Quit.  It quits.\n");
    else {
      printf("Sorry, no help on \"%s\"\n", argv[1]);
      puts("Available: flat help istore time");
      return;
    }
    return;
  }
  puts("Addb is a test client for libaddb.a, the attention deficit datab--OOH, "
       "SHINY!\n"
       "For help on a command, use \"help command\".  Quickreference:\n"
       "    help [command]       flat open [path [data]]    istore open [path]\n"
       "    quit                 flat close                 istore close\n"
       "    time                 flat remove [path]         istore remove "
       "[path]\n"
       "    time [on / off]      flat read [nbytes]         istore read N "
       "[nbytes]\n"
       "    time now             flat write data            istore write [[N] "
       "size]\n");
}
```