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

```asm
<main>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x1b8,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x1a8(%rsp)
  xor    %eax,%eax
  lea    D5(%rip),%r13
  lea    D68(%rip),%r12
  lea    D97(%rip),%rbp
  lea    D81(%rip),%rbx
L65:
  mov    %r13,%rdi
  call   <printf@plt>
  mov    %r12,%rdi
  call   <printf@plt>
  mov    %rbp,%rdi
  call   <printf@plt>
  mov    %rbx,%rdi
  call   <printf@plt>
  lea    D61(%rip),%rdi
  call   <printf@plt>
  lea    D31(%rip),%rdi
  call   <printf@plt>
  lea    D30(%rip),%rdi
  call   <printf@plt>
  lea    D79(%rip),%rdi
  call   <printf@plt>
  lea    D27(%rip),%rdi
  call   <printf@plt>
  lea    0xf(%rsp),%rsi
  lea    D115(%rip),%rdi
  call   <scanf@plt>
  movzbl 0xf(%rsp),%eax
  sub    $0x64,%eax
  cmp    $0xf,%al
  ja     L68
  movzbl %al,%eax
  lea    D113(%rip),%rdx
  movslq (%rdx,%rax,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  lea    0x10(%rsp),%rdi
  call   <input@plt>
  jmp    L65
  lea    0x10(%rsp),%rdi
  call   <print@plt>
  jmp    L65
  lea    0x10(%rsp),%rdi
  call   <delete@plt>
  jmp    L65
  lea    0x10(%rsp),%rdi
  call   <search@plt>
  jmp    L65
  lea    0x10(%rsp),%rdi
  call   <edit@plt>
  jmp    L65
  lea    0x10(%rsp),%rdi
  call   <sort@plt>
  jmp    L65
L68:
  lea    D39(%rip),%rdi
  call   <printf@plt>
  jmp    L65
  mov    0x1a8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L72
  mov    $0x0,%eax
  add    $0x1b8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
L72:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: label: D5
type: string
name: retrieve_data
arguments: label: D68
type: string
name: retrieve_data
arguments: label: D97
type: string
name: retrieve_data
arguments: label: D81
type: string
name: retrieve_data
arguments: label: D61
type: string
name: retrieve_data
arguments: label: D31
type: string
name: retrieve_data
arguments: label: D30
type: string
name: retrieve_data
arguments: label: D79
type: string
name: retrieve_data
arguments: label: D27
type: string
name: retrieve_data
arguments: label: D115
type: string
name: retrieve_data
arguments: label: D39
type: string

tool: D5: MENU


tool: D68: i:input


tool: D97: p:print


tool: D81: f:search


tool: D61: d:delete


tool: D31: e:edit


tool: D30: s:sort


tool: D79: q:quit


tool: D27: Enter your choice:

tool: D115: %c

tool: D39: Invalid choice


assistant: ```c
main() {
  char db[20][20], choice;
  while (1) {
    printf("MENU\n");
    printf("i:input\n");
    printf("p:print\n");
    printf("f:search\n");
    printf("d:delete\n");
    printf("e:edit\n");
    printf("s:sort\n");
    printf("q:quit\n");
    printf("Enter your choice:");
    scanf("%c", &choice);
    switch (choice) {
    case 'i':
      input(db);
      break;
    case 'p':
      print(db);
      break;
    case 'd':
      delete (db);
      break;
    case 'f':
      search(db);
      break;
    case 'e':
      edit(db);
      break;
    case 's':
      sort(db);
      break;
    case 'q':
      return;
    default:
      printf("Invalid choice\n");
    }
  }
  while (getchar() != 10)
    ;
}
```