user: What is the c source code of the assembly code below?

```asm
<merge>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x28(%rbp)
  mov    %esi,-0x2c(%rbp)
  mov    %edx,-0x30(%rbp)
  mov    %ecx,-0x34(%rbp)
  mov    %r8,-0x40(%rbp)
  mov    -0x2c(%rbp),%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x30(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,-0x10(%rbp)
  movl   $0x0,-0xc(%rbp)
  mov    -0x34(%rbp),%eax
  sub    -0x2c(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,-0x4(%rbp)
  jmp    L72
L59:
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rcx
  mov    -0x28(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%eax
  cmp    %eax,%edx
  jg     L2
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    -0xc(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,4),%rcx
  mov    -0x40(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%eax
  mov    %eax,(%rdx)
  addl   $0x1,-0x14(%rbp)
  jmp    L101
L2:
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    -0xc(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,4),%rcx
  mov    -0x40(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%eax
  mov    %eax,(%rdx)
  addl   $0x1,-0x10(%rbp)
L101:
  addl   $0x1,-0xc(%rbp)
L72:
  mov    -0x14(%rbp),%eax
  cmp    -0x30(%rbp),%eax
  jg     L102
  mov    -0x10(%rbp),%eax
  cmp    -0x34(%rbp),%eax
  jle    L59
  jmp    L102
L81:
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    -0xc(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,4),%rcx
  mov    -0x40(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%eax
  mov    %eax,(%rdx)
  addl   $0x1,-0x14(%rbp)
  addl   $0x1,-0xc(%rbp)
L102:
  mov    -0x14(%rbp),%eax
  cmp    -0x30(%rbp),%eax
  jle    L81
  jmp    L1
L51:
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    -0xc(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,4),%rcx
  mov    -0x40(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%eax
  mov    %eax,(%rdx)
  addl   $0x1,-0x10(%rbp)
  addl   $0x1,-0xc(%rbp)
L1:
  mov    -0x10(%rbp),%eax
  cmp    -0x34(%rbp),%eax
  jle    L51
  movl   $0x0,-0x8(%rbp)
  jmp    L6
L34:
  mov    -0x8(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    -0x2c(%rbp),%ecx
  mov    -0x8(%rbp),%edx
  add    %ecx,%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,4),%rcx
  mov    -0x28(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%eax
  mov    %eax,(%rdx)
  addl   $0x1,-0x8(%rbp)
L6:
  mov    -0x8(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jl     L34
  nop
  nop
  pop    %rbp
  ret
```

assistant: ```c
void merge(int *array, int begining, int half, int end, int *aux_array) {
  int idx_first_array = begining, idx_second_array = half + 1, idx_new_array = 0, length_new_array = end - begining + 1, i;
  while (idx_first_array <= half && idx_second_array <= end) {
    if (array[idx_first_array] <= array[idx_second_array]) {
      aux_array[idx_new_array] = array[idx_first_array];
      idx_first_array++;
    } else {
      aux_array[idx_new_array] = array[idx_second_array];
      idx_second_array++;
    }
    idx_new_array++;
  }
  while (idx_first_array <= half) {
    aux_array[idx_new_array] = array[idx_first_array];
    idx_first_array++;
    idx_new_array++;
  }
  while (idx_second_array <= end) {
    aux_array[idx_new_array] = array[idx_second_array];
    idx_second_array++;
    idx_new_array++;
  }
  for (i = 0; i < length_new_array; i++) {
    array[begining + i] = aux_array[i];
  }
}
```