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

```asm
<combine>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %rdx,-0x48(%rbp)
  movq   $0x0,-0x28(%rbp)
  movq   $0x0,-0x20(%rbp)
  movq   $0x0,-0x18(%rbp)
  movq   $0x0,-0x10(%rbp)
  mov    -0x40(%rbp),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  shr    %rax
  mov    %rax,-0x10(%rbp)
  mov    -0x48(%rbp),%rax
  sub    -0x40(%rbp),%rax
  shl    $0x3,%rax
  mov    %rax,%rdi
  call   <malloc@plt>
  mov    %rax,-0x8(%rbp)
  mov    -0x40(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  movq   $0x0,-0x18(%rbp)
  jmp    L3
L21:
  mov    -0x28(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x20(%rbp),%rax
  lea    0x0(,%rax,8),%rcx
  mov    -0x38(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%rax
  cmp    %rax,%rdx
  jae    L85
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  lea    0x0(,%rax,8),%rdx
  mov    -0x8(%rbp),%rax
  add    %rax,%rdx
  mov    (%rcx),%rax
  mov    %rax,(%rdx)
  jmp    L3
L85:
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  lea    0x0(,%rax,8),%rdx
  mov    -0x8(%rbp),%rax
  add    %rax,%rdx
  mov    (%rcx),%rax
  mov    %rax,(%rdx)
L3:
  mov    -0x28(%rbp),%rax
  cmp    -0x10(%rbp),%rax
  jae    L65
  mov    -0x20(%rbp),%rax
  cmp    -0x48(%rbp),%rax
  jb     L21
  jmp    L65
L64:
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  lea    0x0(,%rax,8),%rdx
  mov    -0x8(%rbp),%rax
  add    %rax,%rdx
  mov    (%rcx),%rax
  mov    %rax,(%rdx)
L65:
  mov    -0x28(%rbp),%rax
  cmp    -0x10(%rbp),%rax
  jb     L64
  jmp    L76
L69:
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  lea    0x0(,%rax,8),%rdx
  mov    -0x8(%rbp),%rax
  add    %rax,%rdx
  mov    (%rcx),%rax
  mov    %rax,(%rdx)
L76:
  mov    -0x20(%rbp),%rax
  cmp    -0x48(%rbp),%rax
  jb     L69
  movq   $0x0,-0x18(%rbp)
  jmp    L41
L86:
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  mov    -0x40(%rbp),%rcx
  mov    -0x18(%rbp),%rdx
  add    %rcx,%rdx
  lea    0x0(,%rdx,8),%rcx
  mov    -0x38(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%rax
  mov    %rax,(%rdx)
  addq   $0x1,-0x18(%rbp)
L41:
  mov    -0x48(%rbp),%rax
  sub    -0x40(%rbp),%rax
  cmp    %rax,-0x18(%rbp)
  jb     L86
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  nop
  leave
  ret
```

assistant: ```c
void combine(unsigned long long int *a, unsigned long long int lower, unsigned long long int upper) {
  unsigned long long int i = 0, j = 0, k = 0, mid = 0;
  mid = (lower + upper) / 2;
  unsigned long long int *result;
  result = (unsigned long long int *)malloc((upper - lower) * sizeof(unsigned long long int));
  for (i = lower, j = mid, k = 0; i < mid && j < upper;) {
    if (*(a + i) < *(a + j))
      *(result + k++) = *(a + i++);
    else
      *(result + k++) = *(a + j++);
  }
  while (i < mid)
    *(result + k++) = *(a + i++);
  while (j < upper)
    *(result + k++) = *(a + j++);
  for (k = 0; k < (upper - lower); k++)
    *(a + lower + k) = *(result + k);
  free(result);
}
```