user: Translate the below assembly code into C programming language:

```asm
<print_menu>:
  endbr64
  push   %r15
  xor    %eax,%eax
  push   %r14
  mov    $0x3,%r14d
  push   %r13
  mov    %edi,%r13d
  push   %r12
  mov    %esi,%r12d
  push   %rbp
  push   %rbx
  mov    %r13d,%ebx
  shr    $0x1f,%ebx
  add    %r13d,%ebx
  sub    $0x18,%rsp
  sar    %ebx
  call   <erase@plt>
  lea    -0xe(%r12),%eax
  lea    -0x6(%rbx),%edi
  mov    %eax,%ebp
  lea    D53(%rip),%rdx
  shr    $0x1f,%ebp
  add    %eax,%ebp
  sar    %ebp
  mov    %ebp,%esi
  call   <mvprintw@plt>
  mov    %ebp,%esi
  lea    -0x5(%rbx),%edi
  lea    D24(%rip),%rdx
  call   <mvprintw@plt>
  mov    %ebp,%esi
  lea    -0x4(%rbx),%edi
  lea    D27(%rip),%rdx
  call   <mvprintw@plt>
  mov    %ebp,%esi
  lea    -0x3(%rbx),%edi
  lea    D11(%rip),%rdx
  call   <mvprintw@plt>
  mov    %ebp,%esi
  lea    -0x2(%rbx),%edi
  lea    D16(%rip),%rdx
  call   <mvprintw@plt>
  mov    %ebp,%esi
  lea    D30(%rip),%rdx
  mov    %ebx,%edi
  call   <mvprintw@plt>
  lea    0x2(%r12),%eax
  mov    %eax,%r15d
  shr    $0x1f,%r15d
  add    %eax,%r15d
  lea    0x4(%r12),%eax
  mov    %eax,%ebp
  sar    %r15d
  shr    $0x1f,%ebp
  add    %eax,%ebp
  lea    0x6(%r12),%eax
  add    $0x8,%r12d
  mov    %eax,%r13d
  sar    %ebp
  shr    $0x1f,%r13d
  add    %eax,%r13d
  mov    %r12d,%eax
  shr    $0x1f,%eax
  sar    %r13d
  add    %eax,%r12d
  sar    %r12d
  jmp    L37
  nopw   0x0(%rax,%rax,1)
L7:
  mov    $0x20,%edx
  mov    %ebp,%esi
  mov    %ebx,%edi
  call   <mvaddch@plt>
  mov    $0x20,%edx
  mov    %r13d,%esi
  mov    %ebx,%edi
  call   <mvaddch@plt>
  mov    %r12d,%esi
  mov    %ebx,%edi
  mov    $0x20,%edx
  call   <mvaddch@plt>
  mov    %ebp,%esi
  mov    %ebx,%edi
  call   <move@plt>
L37:
  xor    %eax,%eax
  call   <getch@plt>
  mov    %eax,%ecx
  cmp    $0xa,%al
  je     L1
  lea    -0x31(%rcx),%eax
  cmp    $0x2,%al
  ja     L7
  movsbl %cl,%edx
  mov    %r15d,%esi
  mov    %ebx,%edi
  mov    %cl,0xf(%rsp)
  call   <mvaddch@plt>
  movzbl 0xf(%rsp),%ecx
  mov    $0x1,%r14d
  cmp    $0x31,%cl
  je     L7
  xor    %r14d,%r14d
  cmp    $0x32,%cl
  setne  %r14b
  add    $0x2,%r14d
  jmp    L7
  nopw   0x0(%rax,%rax,1)
L1:
  add    $0x18,%rsp
  mov    %r14d,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: disassemble_data
arguments: data_tag: D53
type_infered: string
name: disassemble_data
arguments: data_tag: D24
type_infered: string
name: disassemble_data
arguments: data_tag: D27
type_infered: string
name: disassemble_data
arguments: data_tag: D11
type_infered: string
name: disassemble_data
arguments: data_tag: D16
type_infered: string
name: disassemble_data
arguments: data_tag: D30
type_infered: string

tool: D53:    Snake Game

tool: D24: ================

tool: D27:  1.  New Game

tool: D11:  2.  Options

tool: D16:  3.  Quit

tool: D30: input > 3

assistant: ```c
int print_menu(int rows, int cols) {
  erase();
  char in;
  int choice = 3;
  mvprintw(rows / 2 - 6, (cols - 14) / 2, "   Snake Game");
  mvprintw(rows / 2 - 5, (cols - 14) / 2, "================");
  mvprintw(rows / 2 - 4, (cols - 14) / 2, " 1.  New Game");
  mvprintw(rows / 2 - 3, (cols - 14) / 2, " 2.  Options");
  mvprintw(rows / 2 - 2, (cols - 14) / 2, " 3.  Quit");
  mvprintw(rows / 2, (cols - 14) / 2, "input > 3");
  while (true) {
    in = getch();
    if (in == 10) {
      return choice;
    }
    if (in == '1' || in == '2' || in == '3') {
      mvaddch(rows / 2, (cols + 2) / 2, in);
      if (in == '1')
        choice = 1;
      if (in == '2')
        choice = 2;
      if (in == '3')
        choice = 3;
    }
    mvaddch(rows / 2, (cols + 4) / 2, ' ');
    mvaddch(rows / 2, (cols + 6) / 2, ' ');
    mvaddch(rows / 2, (cols + 8) / 2, ' ');
    move(rows / 2, (cols + 4) / 2);
  }
}
```