user: 下面的汇编指令对应的C源代码是什么:

```asm
<merge_sort_top_down_internal>:
  endbr64
  cmp    %rcx,%rdx
  jb     L126
  ret
  nopw   0x0(%rax,%rax,1)
L126:
  mov    %rcx,%rax
  push   %r15
  sub    %rdx,%rax
  push   %r14
  mov    %rax,%r14
  push   %r13
  mov    %rsi,%r13
  push   %r12
  shr    %r14
  mov    %rdx,%r12
  push   %rbp
  add    %rdx,%r14
  mov    %rdi,%rbp
  push   %rbx
  mov    %rcx,%rbx
  sub    $0x38,%rsp
  cmp    %r14,%rdx
  jae    L149
  mov    %rax,%r15
  shr    $0x2,%r15
  add    %rdx,%r15
  cmp    %r15,%rdx
  jb     L187
  lea    0x1(%r15),%r9
  cmp    %r9,%r14
  ja     L174
L209:
  mov    %r14,%r8
  mov    %r15,%rcx
  mov    %r12,%rdx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  call   <merge@plt>
L149:
  lea    0x1(%r14),%r15
  cmp    %rbx,%r15
  jae    L17
  mov    %rbx,%rax
  sub    %r15,%rax
  mov    %rax,%r9
  shr    %r9
  add    %r15,%r9
  cmp    %r9,%r15
  jb     L165
  lea    0x1(%r9),%r10
  cmp    %r10,%rbx
  ja     L85
L89:
  mov    %rbx,%r8
  mov    %r9,%rcx
  mov    %r15,%rdx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  call   <merge@plt>
L17:
  add    $0x38,%rsp
  mov    %rbx,%r8
  mov    %r14,%rcx
  mov    %r12,%rdx
  pop    %rbx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1050 <merge@plt>
  nopw   0x0(%rax,%rax,1)
L85:
  mov    %rbx,%rax
  sub    %r10,%rax
  mov    %rax,%r11
  shr    %r11
  add    %r10,%r11
  cmp    %r11,%r10
  jae    L57
  shr    $0x2,%rax
  mov    %r10,%rdx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  add    %r10,%rax
  mov    %r9,0x28(%rsp)
  mov    %rax,%rcx
  mov    %r10,0x20(%rsp)
  mov    %r11,0x10(%rsp)
  mov    %rax,0x8(%rsp)
  call   <merge_sort_top_down_internal>
  mov    0x8(%rsp),%rax
  mov    %r13,%rsi
  mov    %rbp,%rdi
  mov    0x10(%rsp),%r11
  lea    0x1(%rax),%rdx
  mov    %rax,0x18(%rsp)
  mov    %r11,%rcx
  mov    %r11,0x8(%rsp)
  call   <merge_sort_top_down_internal>
  mov    0x8(%rsp),%r11
  mov    %r13,%rsi
  mov    %rbp,%rdi
  mov    0x20(%rsp),%r10
  mov    0x18(%rsp),%rcx
  mov    %r11,%r8
  mov    %r11,0x10(%rsp)
  mov    %r10,%rdx
  mov    %r10,0x8(%rsp)
  call   <merge@plt>
  mov    0x28(%rsp),%r9
  mov    0x10(%rsp),%r11
  mov    0x8(%rsp),%r10
L57:
  lea    0x1(%r11),%rax
  cmp    %rax,%rbx
  jbe    L48
  mov    %rbx,%rdx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  mov    %r11,0x28(%rsp)
  sub    %rax,%rdx
  mov    %r10,0x20(%rsp)
  shr    %rdx
  mov    %r9,0x18(%rsp)
  lea    (%rdx,%rax,1),%rcx
  mov    %rax,%rdx
  mov    %rax,0x10(%rsp)
  mov    %rcx,0x8(%rsp)
  call   <merge_sort_top_down_internal>
  mov    0x8(%rsp),%rcx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  lea    0x1(%rcx),%rdx
  mov    %rbx,%rcx
  call   <merge_sort_top_down_internal>
  mov    0x8(%rsp),%rcx
  mov    %rbx,%r8
  mov    %r13,%rsi
  mov    0x10(%rsp),%rdx
  mov    %rbp,%rdi
  call   <merge@plt>
  mov    0x28(%rsp),%r11
  mov    0x20(%rsp),%r10
  mov    0x18(%rsp),%r9
L48:
  mov    %rbx,%r8
  mov    %r11,%rcx
  mov    %r10,%rdx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  mov    %r9,0x8(%rsp)
  call   <merge@plt>
  mov    0x8(%rsp),%r9
  jmp    L89
  nopl   0x0(%rax)
L165:
  mov    %rax,%r10
  shr    $0x2,%r10
  add    %r15,%r10
  cmp    %r10,%r15
  jae    L38
  shr    $0x3,%rax
  mov    %r15,%rdx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  lea    (%rax,%r15,1),%r11
  mov    %r9,0x18(%rsp)
  mov    %r11,%rcx
  mov    %r10,0x20(%rsp)
  mov    %r11,0x8(%rsp)
  call   <merge_sort_top_down_internal>
  mov    0x8(%rsp),%r11
  mov    %r13,%rsi
  mov    %rbp,%rdi
  mov    0x20(%rsp),%r10
  lea    0x1(%r11),%rdx
  mov    %r11,0x10(%rsp)
  mov    %r10,%rcx
  mov    %r10,0x8(%rsp)
  call   <merge_sort_top_down_internal>
  mov    0x8(%rsp),%r8
  mov    %r15,%rdx
  mov    %r13,%rsi
  mov    0x10(%rsp),%rcx
  mov    %rbp,%rdi
  call   <merge@plt>
  mov    0x18(%rsp),%r9
  mov    0x8(%rsp),%r10
L38:
  lea    0x1(%r10),%rax
  cmp    %rax,%r9
  jbe    L26
  mov    %r9,%r11
  mov    %rax,%rdx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  sub    %rax,%r11
  mov    %r10,0x28(%rsp)
  shr    %r11
  mov    %rax,0x18(%rsp)
  add    %rax,%r11
  mov    %r9,0x20(%rsp)
  mov    %r11,%rcx
  mov    %r11,0x8(%rsp)
  call   <merge_sort_top_down_internal>
  mov    0x8(%rsp),%r11
  mov    %r13,%rsi
  mov    %rbp,%rdi
  mov    0x20(%rsp),%r9
  lea    0x1(%r11),%rdx
  mov    %r11,0x10(%rsp)
  mov    %r9,%rcx
  mov    %r9,0x8(%rsp)
  call   <merge_sort_top_down_internal>
  mov    0x8(%rsp),%r8
  mov    %r13,%rsi
  mov    %rbp,%rdi
  mov    0x10(%rsp),%rcx
  mov    0x18(%rsp),%rdx
  call   <merge@plt>
  mov    0x28(%rsp),%r10
  mov    0x8(%rsp),%r9
L26:
  mov    %r9,%r8
  mov    %r10,%rcx
  mov    %r15,%rdx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  mov    %r9,0x8(%rsp)
  call   <merge@plt>
  mov    0x8(%rsp),%r9
  lea    0x1(%r9),%r10
  cmp    %r10,%rbx
  jbe    L89
  jmp    L85
  nopl   0x0(%rax,%rax,1)
L174:
  mov    %r14,%rax
  sub    %r9,%rax
  mov    %rax,%r10
  shr    %r10
  add    %r9,%r10
  cmp    %r10,%r9
  jae    L92
  shr    $0x2,%rax
  mov    %r9,%rdx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  lea    (%rax,%r9,1),%r11
  mov    %r9,0x20(%rsp)
  mov    %r11,%rcx
  mov    %r10,0x10(%rsp)
  mov    %r11,0x8(%rsp)
  call   <merge_sort_top_down_internal>
  mov    0x8(%rsp),%r11
  mov    %r13,%rsi
  mov    %rbp,%rdi
  mov    0x10(%rsp),%r10
  lea    0x1(%r11),%rdx
  mov    %r11,0x18(%rsp)
  mov    %r10,%rcx
  mov    %r10,0x8(%rsp)
  call   <merge_sort_top_down_internal>
  mov    0x8(%rsp),%r10
  mov    %r13,%rsi
  mov    %rbp,%rdi
  mov    0x20(%rsp),%r9
  mov    0x18(%rsp),%rcx
  mov    %r10,%r8
  mov    %r10,0x10(%rsp)
  mov    %r9,%rdx
  mov    %r9,0x8(%rsp)
  call   <merge@plt>
  mov    0x10(%rsp),%r10
  mov    0x8(%rsp),%r9
L92:
  lea    0x1(%r10),%rax
  cmp    %rax,%r14
  jbe    L150
  mov    %r14,%r11
  mov    %rax,%rdx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  sub    %rax,%r11
  mov    %r10,0x20(%rsp)
  shr    %r11
  mov    %r9,0x18(%rsp)
  add    %rax,%r11
  mov    %rax,0x10(%rsp)
  mov    %r11,%rcx
  mov    %r11,0x8(%rsp)
  call   <merge_sort_top_down_internal>
  mov    0x8(%rsp),%r11
  mov    %r14,%rcx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  lea    0x1(%r11),%rdx
  call   <merge_sort_top_down_internal>
  mov    0x8(%rsp),%rcx
  mov    %r14,%r8
  mov    %r13,%rsi
  mov    0x10(%rsp),%rdx
  mov    %rbp,%rdi
  call   <merge@plt>
  mov    0x20(%rsp),%r10
  mov    0x18(%rsp),%r9
L150:
  mov    %r14,%r8
  mov    %r10,%rcx
  mov    %r9,%rdx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  call   <merge@plt>
  jmp    L209
  xchg   %ax,%ax
L187:
  mov    %rax,%r10
  shr    $0x3,%r10
  add    %rdx,%r10
  cmp    %r10,%rdx
  jae    L159
  shr    $0x4,%rax
  mov    %r10,0x18(%rsp)
  lea    (%rax,%rdx,1),%r9
  mov    %r9,%rcx
  mov    %r9,0x8(%rsp)
  call   <merge_sort_top_down_internal>
  mov    0x8(%rsp),%r9
  mov    %r13,%rsi
  mov    %rbp,%rdi
  mov    0x18(%rsp),%r10
  lea    0x1(%r9),%rdx
  mov    %r9,0x10(%rsp)
  mov    %r10,%rcx
  mov    %r10,0x8(%rsp)
  call   <merge_sort_top_down_internal>
  mov    0x8(%rsp),%r8
  mov    %r12,%rdx
  mov    %r13,%rsi
  mov    0x10(%rsp),%rcx
  mov    %rbp,%rdi
  call   <merge@plt>
  mov    0x8(%rsp),%r10
L159:
  lea    0x1(%r10),%r9
  cmp    %r9,%r15
  jbe    L76
  mov    %r15,%r11
  mov    %r9,%rdx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  sub    %r9,%r11
  mov    %r10,0x18(%rsp)
  shr    %r11
  mov    %r9,0x10(%rsp)
  add    %r9,%r11
  mov    %r11,%rcx
  mov    %r11,0x8(%rsp)
  call   <merge_sort_top_down_internal>
  mov    0x8(%rsp),%r11
  mov    %r15,%rcx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  lea    0x1(%r11),%rdx
  call   <merge_sort_top_down_internal>
  mov    0x8(%rsp),%rcx
  mov    %r15,%r8
  mov    %r13,%rsi
  mov    0x10(%rsp),%rdx
  mov    %rbp,%rdi
  call   <merge@plt>
  mov    0x18(%rsp),%r10
L76:
  mov    %r15,%r8
  mov    %r10,%rcx
  mov    %r12,%rdx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  call   <merge@plt>
  lea    0x1(%r15),%r9
  cmp    %r9,%r14
  jbe    L209
  jmp    L174
```

assistant: ```c
void merge_sort_top_down_internal(int array[], int temp[], size_t low, size_t high) {
  if (low >= high) {
    return;
  }
  size_t middle = low + (high - low) / 2;
  merge_sort_top_down_internal(array, temp, low, middle);
  merge_sort_top_down_internal(array, temp, middle + 1, high);
  merge(array, temp, low, middle, high);
}
```