user: Please show me the C implementation that matches the assembly code listed below:

```asm
<load_menu>:
  endbr64
  push   %r15
  lea    D27(%rip),%r15
  push   %r14
  lea    D23(%rip),%r14
  push   %r13
  lea    D200(%rip),%r13
  push   %r12
  lea    D168(%rip),%r12
  push   %rbp
  lea    D36(%rip),%rbp
  push   %rbx
  lea    D15(%rip),%rbx
  sub    $0x28,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  lea    0x14(%rsp),%rax
  mov    %rax,0x8(%rsp)
  cs nopw 0x0(%rax,%rax,1)
L76:
  mov    %r15,%rdi
  call   <printf@plt>
  mov    %r14,%rdi
  call   <printf@plt>
  mov    %r13,%rdi
  call   <printf@plt>
  mov    %r12,%rdi
  call   <printf@plt>
  lea    D112(%rip),%rdi
  call   <printf@plt>
  lea    D217(%rip),%rdi
  call   <printf@plt>
  lea    D215(%rip),%rdi
  call   <printf@plt>
  lea    D196(%rip),%rdi
  call   <printf@plt>
  lea    D85(%rip),%rdi
  call   <printf@plt>
  lea    D117(%rip),%rdi
  call   <printf@plt>
  lea    D147(%rip),%rdi
  call   <printf@plt>
  lea    D137(%rip),%rdi
  call   <printf@plt>
  lea    D96(%rip),%rdi
  call   <printf@plt>
  lea    D34(%rip),%rdi
  call   <printf@plt>
  lea    D67(%rip),%rdi
  call   <printf@plt>
  lea    D12(%rip),%rdi
  call   <printf@plt>
  mov    0x8(%rsp),%rsi
  mov    %rbp,%rdi
  call   <scanf@plt>
  cmpl   $0x8,0x14(%rsp)
  ja     L59
  mov    0x14(%rsp),%eax
  movslq (%rbx,%rax,4),%rax
  add    %rbx,%rax
  notrack jmp *%rax
  cs nopw 0x0(%rax,%rax,1)
  xor    %eax,%eax
  call   <frimg@plt>
  mov    0x14(%rsp),%eax
  nopl   0x0(%rax,%rax,1)
L90:
  test   %eax,%eax
  jne    L76
  nopl   0x0(%rax,%rax,1)
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L54
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
  xor    %eax,%eax
  call   <fbimg@plt>
  mov    0x14(%rsp),%eax
  jmp    L90
  nopl   (%rax)
  xor    %eax,%eax
  call   <setscheduler@plt>
  mov    0x14(%rsp),%eax
  jmp    L90
  nopl   (%rax)
  xor    %eax,%eax
  call   <readaheadmenu@plt>
  mov    0x14(%rsp),%eax
  jmp    L90
  nopl   (%rax)
  xor    %eax,%eax
  call   <readahead@plt>
  lea    D19(%rip),%rdi
  call   <printf@plt>
  xor    %eax,%eax
  call   <readahead2@plt>
  lea    D19(%rip),%rdi
  call   <printf@plt>
  xor    %eax,%eax
  call   <iosched@plt>
  mov    0x14(%rsp),%eax
  jmp    L90
  xchg   %ax,%ax
  xor    %eax,%eax
  call   <cpumenu@plt>
  mov    0x14(%rsp),%eax
  jmp    L90
  xor    %eax,%eax
  call   <uvovmenu@plt>
  mov    0x14(%rsp),%eax
  jmp    L90
  xor    %eax,%eax
  call   <vddlevels@plt>
  lea    D19(%rip),%rdi
  call   <printf@plt>
  xor    %eax,%eax
  call   <cpugovernor@plt>
  mov    0x14(%rsp),%eax
  jmp    L90
L59:
  lea    D86(%rip),%rdi
  call   <printf@plt>
  mov    0x14(%rsp),%eax
  jmp    L90
L54:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: tag: D27
datatype: string
name: disassemble_data
arguments: tag: D23
datatype: string
name: disassemble_data
arguments: tag: D200
datatype: string
name: disassemble_data
arguments: tag: D168
datatype: string
name: disassemble_data
arguments: tag: D36
datatype: string
name: disassemble_data
arguments: tag: D112
datatype: string
name: disassemble_data
arguments: tag: D217
datatype: string
name: disassemble_data
arguments: tag: D215
datatype: string
name: disassemble_data
arguments: tag: D196
datatype: string
name: disassemble_data
arguments: tag: D85
datatype: string
name: disassemble_data
arguments: tag: D117
datatype: string
name: disassemble_data
arguments: tag: D147
datatype: string
name: disassemble_data
arguments: tag: D137
datatype: string
name: disassemble_data
arguments: tag: D96
datatype: string
name: disassemble_data
arguments: tag: D34
datatype: string
name: disassemble_data
arguments: tag: D67
datatype: string
name: disassemble_data
arguments: tag: D12
datatype: string
name: disassemble_data
arguments: tag: D19
datatype: string
name: disassemble_data
arguments: tag: D86
datatype: string

tool: D27: 
 - S4 Utils v0.2 (by broodplank)



tool: D23:   ----[ CPU Settings ]----


tool: D200:  [1] Check current CPU frequency/voltage table and governor


tool: D168:  [2] Undervolt / Overvolt CPU


tool: D36: %d

tool: D112:  [3] CPU Governor and Min/Max Freq



tool: D217:  ----[ I/O Settings ]----


tool: D215:  [4] Check current readahead and I/O scheduler 


tool: D196:  [5] Set Readahead for Internal/External SD


tool: D85:  [6] Set I/O Scheduler



tool: D117:  ----[ Install / Restore ]----


tool: D147:  [7] Make current settings persistent


tool: D137:  [8] Restore default settings



tool: D96:   ----[ Extra ]----


tool: D34:  [9] Fake Factory Reset



tool: D67:  [0] Exit



tool: D12: Selection: 

tool: D19: 


tool: D86: Bad input, quitting!


assistant: ```c
void load_menu(void) {
  int choice;
  do {
    printf("\n - S4 Utils v0.2 (by broodplank)\n\n");
    printf("  ----[ CPU Settings ]----\n");
    printf(" [1] Check current CPU frequency/voltage table and governor\n");
    printf(" [2] Undervolt / Overvolt CPU\n");
    printf(" [3] CPU Governor and Min/Max Freq\n\n");
    printf(" ----[ I/O Settings ]----\n");
    printf(" [4] Check current readahead and I/O scheduler \n");
    printf(" [5] Set Readahead for Internal/External SD\n");
    printf(" [6] Set I/O Scheduler\n\n");
    printf(" ----[ Install / Restore ]----\n");
    printf(" [7] Make current settings persistent\n");
    printf(" [8] Restore default settings\n\n");
    printf("  ----[ Extra ]----\n");
    printf(" [9] Fake Factory Reset\n\n");
    printf(" [0] Exit\n\n");
    printf("Selection: ");
    scanf("%d", &choice);
    switch (choice) {
    case 1:
      vddlevels();
      printf("\n");
      cpugovernor();
      break;
    case 2:
      uvovmenu();
      break;
    case 3:
      cpumenu();
      break;
    case 4:
      readahead();
      printf("\n");
      readahead2();
      printf("\n");
      iosched();
      break;
    case 5:
      readaheadmenu();
      break;
    case 6:
      setscheduler();
      break;
    case 7:
      fbimg();
      break;
    case 8:
      frimg();
      break;
    case 0:
      break;
    default:
      printf("Bad input, quitting!\n");
      break;
    }
  } while (choice != 0);
}
```