user: 这段汇编代码用C语言表示是什么样的？

```asm
<my_cmd_demo>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %edi,-0x34(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    D29(%rip),%rax
  mov    %rax,-0x20(%rbp)
  lea    D49(%rip),%rax
  mov    %rax,-0x18(%rbp)
  movq   $0x0,-0x10(%rbp)
  lea    -0x20(%rbp),%rdx
  mov    -0x34(%rbp),%eax
  lea    D18(%rip),%rcx
  mov    %rcx,%rsi
  mov    %eax,%edi
  call   <check_cmd@plt>
  test   %rax,%rax
  je     L71
  mov    $0xffffffff,%eax
  jmp    L27
L71:
  mov    -0x40(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,%rsi
  lea    D5(%rip),%rax
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L101
  mov    -0x34(%rbp),%eax
  lea    D56(%rip),%rdx
  mov    %rdx,%rcx
  mov    $0x1,%edx
  mov    $0x1,%esi
  mov    %eax,%edi
  call   <check_argc@plt>
  test   %rax,%rax
  je     L69
  mov    $0xffffffff,%eax
  jmp    L27
L69:
  mov    $0x0,%eax
  call   <get_demo@plt>
  mov    %eax,%esi
  lea    D57(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L64
L101:
  mov    -0x40(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,%rsi
  lea    D9(%rip),%rax
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L125
  mov    -0x34(%rbp),%eax
  lea    D64(%rip),%rdx
  mov    %rdx,%rcx
  mov    $0x2,%edx
  mov    $0x2,%esi
  mov    %eax,%edi
  call   <check_argc@plt>
  test   %rax,%rax
  je     L30
  mov    $0xffffffff,%eax
  jmp    L27
L30:
  mov    -0x40(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  mov    %rax,%rdi
  call   <extract_val@plt>
  mov    %rax,-0x28(%rbp)
  cmpq   $0x0,-0x28(%rbp)
  je     L62
  cmpq   $0x3,-0x28(%rbp)
  jbe    L56
L62:
  mov    -0x40(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  mov    %rax,%rdi
  call   <print_unknown_arg@plt>
  mov    $0xffffffff,%eax
  jmp    L27
L56:
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <set_demo@plt>
  mov    $0x0,%eax
  call   <get_demo@plt>
  mov    %eax,%esi
  lea    D41(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L64
L125:
  mov    -0x40(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,%rdi
  call   <print_unknown_cmd@plt>
  mov    $0xffffffff,%eax
  jmp    L27
L64:
  mov    $0x0,%eax
L27:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L24
  call   <__stack_chk_fail@plt>
L24:
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_tag: D29
type_guessed: string
name: parse_data
arguments: data_tag: D49
type_guessed: string
name: parse_data
arguments: data_tag: D18
type_guessed: string
name: parse_data
arguments: data_tag: D5
type_guessed: string
name: parse_data
arguments: data_tag: D56
type_guessed: string
name: parse_data
arguments: data_tag: D57
type_guessed: string
name: parse_data
arguments: data_tag: D9
type_guessed: string
name: parse_data
arguments: data_tag: D64
type_guessed: string
name: parse_data
arguments: data_tag: D41
type_guessed: string

tool: D29: set   load demo (1 | 2 | 3)

tool: D49: get   print current demo configuration

tool: D18: demo

tool: D5: get

tool: 

tool: D57: demo configuration %d


tool: D9: set

tool: D64: demo set ID

tool: D41: selecting demo %d


assistant: ```c
int my_cmd_demo(int argc, char **argv) {
  char *usage[] = {"set   load demo (1 | 2 | 3)", "get   print current demo configuration", 0};
  if (check_cmd(argc, "demo", usage))
    return -1;
  if (strcmp("get", argv[0]) == 0) {
    if (check_argc(argc, 1, 1, ""))
      return -1;
    printf("demo configuration %d\n", get_demo());
  } else if (strcmp("set", argv[0]) == 0) {
    if (check_argc(argc, 2, 2, "demo set ID"))
      return -1;
    unsigned long val = extract_val(argv[1]);
    if ((val < 1) || (val > 3)) {
      print_unknown_arg(argv[1]);
      return -1;
    }
    set_demo(val);
    printf("selecting demo %d\n", get_demo());
  } else {
    print_unknown_cmd(argv[0]);
    return -1;
  }
  return 0;
}
```