user: Demonstrate the C code that generates the assembly output below:

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %edi,-0x14(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    $0x0,%eax
  call   <adainit@plt>
  lea    D39(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  lea    D80(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  lea    D2(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  lea    D57(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  lea    D22(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  lea    D93(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  lea    D77(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  lea    D9(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  lea    -0x10(%rbp),%rax
  mov    %rax,%rsi
  lea    D53(%rip),%rax
  mov    %rax,%rdi
  call   <scanf@plt>
  mov    -0x10(%rbp),%eax
  test   %eax,%eax
  jne    L60
  mov    $0x0,%eax
  call   <standard_polysys_solver@plt>
  mov    %eax,-0xc(%rbp)
  jmp    L97
L60:
  mov    -0x10(%rbp),%eax
  cmp    $0x1,%eax
  jne    L7
  mov    $0x0,%eax
  call   <standard_laursys_solver@plt>
  mov    %eax,-0xc(%rbp)
  jmp    L97
L7:
  mov    -0x10(%rbp),%eax
  cmp    $0x2,%eax
  jne    L2
  mov    $0x0,%eax
  call   <dobldobl_polysys_solver@plt>
  mov    %eax,-0xc(%rbp)
  jmp    L97
L2:
  mov    -0x10(%rbp),%eax
  cmp    $0x3,%eax
  jne    L72
  mov    $0x0,%eax
  call   <dobldobl_laursys_solver@plt>
  mov    %eax,-0xc(%rbp)
  jmp    L97
L72:
  mov    -0x10(%rbp),%eax
  cmp    $0x4,%eax
  jne    L30
  mov    $0x0,%eax
  call   <quaddobl_polysys_solver@plt>
  mov    %eax,-0xc(%rbp)
  jmp    L97
L30:
  mov    -0x10(%rbp),%eax
  cmp    $0x5,%eax
  jne    L37
  mov    $0x0,%eax
  call   <quaddobl_laursys_solver@plt>
  mov    %eax,-0xc(%rbp)
  jmp    L97
L37:
  lea    D19(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
L97:
  mov    $0x0,%eax
  call   <adafinal@plt>
  mov    $0x0,%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L87
  call   <__stack_chk_fail@plt>
L87:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: data_label: D39
type_guessed: string
name: retrieve_data
arguments: data_label: D80
type_guessed: string
name: retrieve_data
arguments: data_label: D2
type_guessed: string
name: retrieve_data
arguments: data_label: D57
type_guessed: string
name: retrieve_data
arguments: data_label: D22
type_guessed: string
name: retrieve_data
arguments: data_label: D93
type_guessed: string
name: retrieve_data
arguments: data_label: D77
type_guessed: string
name: retrieve_data
arguments: data_label: D9
type_guessed: string
name: retrieve_data
arguments: data_label: D53
type_guessed: string
name: retrieve_data
arguments: data_label: D19
type_guessed: string

tool: D39: 
MENU for the precision and type of system :


tool: D80:   0. standard double precision on a polynomial system


tool: D2:   1. standard double precision on a Laurent polynomial system


tool: D57:   2. double double precision on a polynomial system


tool: D22:   3. double double precision on a Laurent polynomial system


tool: D93:   4. quad double precision on a polynomial system


tool: D77:   5. quad double precision on a Laurent polynomial system


tool: D9: Type 0, 1, 2, 3, 4, or 5 : 

tool: D53: %d

tool: D19: invalid choice


assistant: ```c
int main(int argc, char *argv[]) {
  int fail, choice;
  adainit();
  printf("\nMENU for the precision and type of system :\n");
  printf("  0. standard double precision on a polynomial system\n");
  printf("  1. standard double precision on a Laurent polynomial system\n");
  printf("  2. double double precision on a polynomial system\n");
  printf("  3. double double precision on a Laurent polynomial system\n");
  printf("  4. quad double precision on a polynomial system\n");
  printf("  5. quad double precision on a Laurent polynomial system\n");
  printf("Type 0, 1, 2, 3, 4, or 5 : ");
  scanf("%d", &choice);
  if (choice == 0)
    fail = standard_polysys_solver();
  else if (choice == 1)
    fail = standard_laursys_solver();
  else if (choice == 2)
    fail = dobldobl_polysys_solver();
  else if (choice == 3)
    fail = dobldobl_laursys_solver();
  else if (choice == 4)
    fail = quaddobl_polysys_solver();
  else if (choice == 5)
    fail = quaddobl_laursys_solver();
  else
    printf("invalid choice\n");
  adafinal();
  return 0;
}
```