user: What would the C source look like for the assembly code provided here?

```asm
<gui_main_get_password>:
  endbr64
  push   %r15
  xor    %eax,%eax
  mov    %rdi,%r15
  push   %r14
  mov    %rsi,%r14
  push   %r13
  mov    %rdx,%r13
  push   %r12
  mov    %rcx,%r12
  push   %rbp
  mov    %r8d,%ebp
  push   %rbx
  sub    $0x8,%rsp
  call   <initscr@plt>
  xor    %eax,%eax
  call   <cbreak@plt>
  xor    %eax,%eax
  call   <noecho@plt>
  xor    %eax,%eax
  call   <clear@plt>
  mov    %r15,%rdx
  xor    %esi,%esi
  xor    %edi,%edi
  call   <mvaddstr@plt>
  mov    %r14,%rdx
  xor    %esi,%esi
  mov    $0x1,%edi
  call   <mvaddstr@plt>
  mov    %r13,%rdx
  xor    %esi,%esi
  mov    $0x2,%edi
  call   <mvaddstr@plt>
  lea    D18(%rip),%rdx
  xor    %esi,%esi
  mov    $0x3,%edi
  call   <mvaddstr@plt>
  xor    %eax,%eax
  call   <refresh@plt>
  mov    %ebp,%edx
  xor    %esi,%esi
  mov    %r12,%rdi
  call   <memset@plt>
  sub    $0x1,%ebp
  test   %ebp,%ebp
  jle    L33
  xor    %ebx,%ebx
  lea    D12(%rip),%r13
  lea    D20(%rip),%r14
  jmp    L29
  nopw   0x0(%rax,%rax,1)
L21:
  test   %ebx,%ebx
  je     L16
  lea    -0x1(%rbx),%r15d
  add    $0x2,%ebx
  mov    %r14,%rdx
  mov    $0x3,%edi
  movslq %r15d,%rax
  mov    %ebx,%esi
  movb   $0x0,(%r12,%rax,1)
  call   <mvaddstr@plt>
  mov    %ebx,%esi
  mov    $0x3,%edi
  mov    %r15d,%ebx
  call   <move@plt>
  xor    %eax,%eax
  call   <refresh@plt>
  cmp    %ebp,%ebx
  jge    L0
L29:
  xor    %eax,%eax
  call   <getch@plt>
  cmp    $0xa,%eax
  je     L0
  cmp    $0x7f,%eax
  je     L21
L94:
  movslq %ebx,%rdx
  lea    0x3(%rbx),%esi
  mov    $0x3,%edi
  add    $0x1,%ebx
  mov    %al,(%r12,%rdx,1)
  mov    %r13,%rdx
  call   <mvaddstr@plt>
  xor    %eax,%eax
  call   <refresh@plt>
  cmp    %ebp,%ebx
  jl     L29
L0:
  movslq %ebx,%rbx
  add    %rbx,%r12
L33:
  movb   $0x0,(%r12)
  xor    %eax,%eax
  call   <refresh@plt>
  add    $0x8,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1130 <endwin@plt>
  nopl   (%rax)
L16:
  xor    %eax,%eax
  call   <refresh@plt>
  xor    %eax,%eax
  call   <getch@plt>
  cmp    $0xa,%eax
  je     L0
  cmp    $0x7f,%eax
  je     L16
  jmp    L94
```

tool_calls: name: disassemble_data
arguments: data_label: D18
type_guessed: string
name: disassemble_data
arguments: data_label: D12
type_guessed: string
name: disassemble_data
arguments: data_label: D20
type_guessed: string

tool: D18: => 

tool: D12: *

tool: D20:  

assistant: ```c
void gui_main_get_password(const char *prompt1, const char *prompt2, const char *prompt3, char *password, int size) {
  int i, ch;
  initscr();
  cbreak();
  noecho();
  clear();
  mvaddstr(0, 0, prompt1);
  mvaddstr(1, 0, prompt2);
  mvaddstr(2, 0, prompt3);
  mvaddstr(3, 0, "=> ");
  refresh();
  memset(password, '\0', size);
  i = 0;
  while (i < size - 1) {
    ch = getch();
    if (ch == '\n')
      break;
    if (ch == 127) {
      if (i > 0) {
        i--;
        password[i] = '\0';
        mvaddstr(3, 3 + i, " ");
        move(3, 3 + i);
      }
    } else {
      password[i] = ch;
      mvaddstr(3, 3 + i, "*");
      i++;
    }
    refresh();
  }
  password[i] = '\0';
  refresh();
  endwin();
}
```