user: 这段汇编代码用C语言表示是什么样的?

```asm
<merge_sort>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  mov    %rdi,%r13
  push   %r12
  mov    %esi,%r12d
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %rdi,0x8(%rsp)
  lea    0x0(,%rsi,4),%edi
  call   <malloc@plt>
  movl   $0x1,(%rsp)
  mov    %rax,%r15
  cmp    $0x1,%r12d
  jle    L10
  nopl   (%rax)
L61:
  mov    (%rsp),%eax
  xor    %ebp,%ebp
  add    %eax,%eax
  mov    %eax,0x4(%rsp)
  nopl   0x0(%rax,%rax,1)
L33:
  mov    (%rsp),%eax
  mov    %r12d,%esi
  lea    0x0(%rbp,%rax,1),%edi
  call   <min@plt>
  mov    %r12d,%esi
  mov    %eax,%r14d
  mov    0x4(%rsp),%eax
  lea    0x0(%rbp,%rax,1),%ebx
  mov    %ebx,%edi
  call   <min@plt>
  mov    %eax,%r8d
  cmp    %eax,%r14d
  jge    L101
  cmp    %ebp,%r14d
  jle    L101
  lea    0x1(%rbp),%edx
  mov    %r14d,%eax
  mov    %ebp,%ecx
  movslq %edx,%rdx
  jmp    L36
  xchg   %ax,%ax
L0:
  add    $0x1,%ecx
L46:
  mov    %r10d,-0x4(%r15,%rdx,4)
  movslq %edx,%r9
  add    $0x1,%rdx
  cmp    %r14d,%ecx
  jge    L143
  cmp    %r8d,%eax
  jge    L143
L36:
  movslq %ecx,%r9
  mov    0x0(%r13,%r9,4),%r10d
  movslq %eax,%r9
  mov    0x0(%r13,%r9,4),%r9d
  cmp    %r9d,%r10d
  jl     L0
  add    $0x1,%eax
  mov    %r9d,%r10d
  jmp    L46
  cs nopw 0x0(%rax,%rax,1)
L101:
  mov    %r14d,%eax
  mov    %ebp,%ecx
  movslq %ebp,%r9
  nopl   0x0(%rax,%rax,1)
L143:
  cmp    %ecx,%r14d
  jle    L91
  movslq %ecx,%rdx
  movslq %r9d,%r10
  sub    %rdx,%r10
  lea    (%r15,%r10,4),%r11
  nopw   0x0(%rax,%rax,1)
L15:
  mov    0x0(%r13,%rdx,4),%r10d
  mov    %r10d,(%r11,%rdx,4)
  add    $0x1,%rdx
  cmp    %edx,%r14d
  jg     L15
  add    %r9d,%r14d
  sub    %ecx,%r14d
  movslq %r14d,%r9
L91:
  cmp    %eax,%r8d
  jle    L171
  cltq
  sub    %rax,%r9
  lea    (%r15,%r9,4),%rcx
  nopl   0x0(%rax)
L157:
  mov    0x0(%r13,%rax,4),%edx
  mov    %edx,(%rcx,%rax,4)
  add    $0x1,%rax
  cmp    %eax,%r8d
  jg     L157
L171:
  mov    %ebx,%ebp
  cmp    %ebx,%r12d
  jg     L33
  shll   (%rsp)
  mov    (%rsp),%eax
  cmp    %eax,%r12d
  jle    L99
  mov    %r13,%rax
  mov    %r15,%r13
  mov    %rax,%r15
  jmp    L61
L99:
  mov    %r12d,%esi
  xor    %eax,%eax
  cmp    %r15,0x8(%rsp)
  je     L70
L162:
  mov    (%r15,%rax,4),%edx
  mov    %edx,0x0(%r13,%rax,4)
  add    $0x1,%rax
  cmp    %rax,%rsi
  jne    L162
L10:
  add    $0x18,%rsp
  mov    %r15,%rdi
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1070 <free@plt>
L70:
  mov    %r13,%r15
  jmp    L10
```

assistant: ```c
void merge_sort(int arr[], int len) {
  int *a = arr;
  int *b = (int *)malloc(len * sizeof(int));
  int seg, start;
  for (seg = 1; seg < len; seg += seg) {
    for (start = 0; start < len; start += (seg + seg)) {
      int low = start, mid = min(start + seg, len), high = min(start + seg + seg, len);
      int k = low;
      int start1 = low, end1 = mid;
      int start2 = mid, end2 = high;
      while (start1 < end1 && start2 < end2)
        b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
      while (start1 < end1)
        b[k++] = a[start1++];
      while (start2 < end2)
        b[k++] = a[start2++];
    }
    int *temp = a;
    a = b;
    b = temp;
  }
  if (a != arr) {
    int i;
    for (i = 0; i < len; i++)
      b[i] = a[i];
    b = a;
  }
  free(b);
}
```