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

```asm
<command_help>:
  endbr64
  push   %rbp
  mov    0x8(%rsi),%rbp
  test   %rbp,%rbp
  je     L67
  lea    D19(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcasecmp@plt>
  test   %eax,%eax
  je     L64
  lea    D97(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcasecmp@plt>
  test   %eax,%eax
  je     L60
  lea    D88(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcasecmp@plt>
  test   %eax,%eax
  je     L25
  lea    D142(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcasecmp@plt>
  test   %eax,%eax
  je     L19
  lea    D36(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcasecmp@plt>
  test   %eax,%eax
  je     L49
  lea    D81(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcasecmp@plt>
  test   %eax,%eax
  jne    L33
  lea    D105(%rip),%rdi
  pop    %rbp
  jmp    1080 <puts@plt>
  nopl   0x0(%rax)
L33:
  mov    %rbp,%rsi
  lea    D102(%rip),%rdi
  call   <printf@plt>
  lea    D39(%rip),%rdi
  pop    %rbp
  jmp    1080 <puts@plt>
  nopl   0x0(%rax)
L25:
  lea    D69(%rip),%rdi
  pop    %rbp
  jmp    1080 <puts@plt>
  nopl   (%rax)
L67:
  lea    D71(%rip),%rdi
  pop    %rbp
  jmp    1080 <puts@plt>
  nopl   (%rax)
L64:
  lea    D33(%rip),%rdi
  pop    %rbp
  jmp    1080 <puts@plt>
  nopl   (%rax)
L60:
  lea    D30(%rip),%rdi
  pop    %rbp
  jmp    1080 <puts@plt>
  nopl   (%rax)
L19:
  lea    D27(%rip),%rdi
  pop    %rbp
  jmp    1080 <puts@plt>
  nopl   (%rax)
L49:
  lea    D86(%rip),%rdi
  pop    %rbp
  jmp    1080 <puts@plt>
```

tool_calls: name: retrieve_data
arguments: label: D19
type_guessed: string
name: retrieve_data
arguments: label: D97
type_guessed: string
name: retrieve_data
arguments: label: D88
type_guessed: string
name: retrieve_data
arguments: label: D142
type_guessed: string
name: retrieve_data
arguments: label: D36
type_guessed: string
name: retrieve_data
arguments: label: D81
type_guessed: string
name: retrieve_data
arguments: label: D105
type_guessed: string
name: retrieve_data
arguments: label: D102
type_guessed: string
name: retrieve_data
arguments: label: D39
type_guessed: string
name: retrieve_data
arguments: label: D69
type_guessed: string
name: retrieve_data
arguments: label: D71
type_guessed: string
name: retrieve_data
arguments: label: D33
type_guessed: string
name: retrieve_data
arguments: label: D30
type_guessed: string
name: retrieve_data
arguments: label: D27
type_guessed: string
name: retrieve_data
arguments: label: D86
type_guessed: string

tool: D19: flat

tool: D97: help

tool: D88: istore

tool: D142: gmap

tool: D36: time

tool: D81: quit

tool: D105: Quit.  It quits.


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


tool: D39: Available: flat help istore time

tool: D69: 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: D71: 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]


tool: D33: 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: D30: 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: D27: 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: D86: 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


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