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

```asm
<qsort_r>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x88,%rsp
  mov    %r8,0x60(%rsp)
  cmp    %rcx,%r8
  jbe    L196
  mov    %rdi,%r13
  mov    %rsi,%r12
  mov    %rdx,%rbp
  mov    %rcx,%r15
L247:
  mov    0x60(%rsp),%r8
  mov    %r15,%rcx
  mov    %rbp,%rdx
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <partition@plt>
  mov    %rax,0x58(%rsp)
  test   %rax,%rax
  jne    L310
L71:
  mov    0x58(%rsp),%r15
  add    $0x1,%r15
  cmp    0x60(%rsp),%r15
  jb     L247
L196:
  add    $0x88,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   (%rax)
L310:
  sub    $0x1,%rax
  mov    %rax,0x50(%rsp)
  cmp    %r15,%rax
  jbe    L71
  mov    %r15,%r14
  mov    %r12,%r15
  mov    %r13,%r12
L324:
  mov    0x50(%rsp),%r8
  mov    %r14,%rcx
  mov    %rbp,%rdx
  mov    %r15,%rsi
  mov    %r12,%rdi
  call   <partition@plt>
  mov    %rax,0x48(%rsp)
  test   %rax,%rax
  jne    L21
L140:
  mov    0x48(%rsp),%r14
  add    $0x1,%r14
  cmp    %r14,0x50(%rsp)
  ja     L324
  mov    %r12,%r13
  mov    %r15,%r12
  jmp    L71
  nop
L21:
  sub    $0x1,%rax
  mov    %rax,0x40(%rsp)
  cmp    %r14,%rax
  jbe    L140
  mov    %r14,%rax
  mov    %r15,%r14
  mov    %rax,%r15
L315:
  mov    0x40(%rsp),%r8
  mov    %r15,%rcx
  mov    %rbp,%rdx
  mov    %r14,%rsi
  mov    %r12,%rdi
  call   <partition@plt>
  mov    %rax,0x38(%rsp)
  test   %rax,%rax
  jne    L37
L150:
  mov    0x38(%rsp),%r15
  add    $0x1,%r15
  cmp    %r15,0x40(%rsp)
  ja     L315
  mov    %r14,%r15
  jmp    L140
  nopl   0x0(%rax)
L37:
  sub    $0x1,%rax
  mov    %rax,0x30(%rsp)
  cmp    %r15,%rax
  jbe    L150
  mov    %r15,%rax
  mov    %r14,%r15
  mov    %rax,%r14
L146:
  mov    0x30(%rsp),%r8
  mov    %r14,%rcx
  mov    %rbp,%rdx
  mov    %r15,%rsi
  mov    %r12,%rdi
  call   <partition@plt>
  mov    %rax,0x28(%rsp)
  test   %rax,%rax
  jne    L147
L213:
  mov    0x28(%rsp),%r14
  add    $0x1,%r14
  cmp    %r14,0x30(%rsp)
  ja     L146
  mov    %r15,%r14
  jmp    L150
  nopl   0x0(%rax)
L147:
  sub    $0x1,%rax
  mov    %rax,0x20(%rsp)
  cmp    %r14,%rax
  jbe    L213
L337:
  mov    0x20(%rsp),%r8
  mov    %r14,%rcx
  mov    %rbp,%rdx
  mov    %r15,%rsi
  mov    %r12,%rdi
  call   <partition@plt>
  mov    %rax,0x18(%rsp)
  test   %rax,%rax
  jne    L171
L94:
  mov    0x18(%rsp),%r14
  add    $0x1,%r14
  cmp    %r14,0x20(%rsp)
  ja     L337
  jmp    L213
L171:
  sub    $0x1,%rax
  mov    %rax,0x10(%rsp)
  cmp    %r14,%rax
  jbe    L94
L58:
  mov    0x10(%rsp),%r8
  mov    %r14,%rcx
  mov    %rbp,%rdx
  mov    %r15,%rsi
  mov    %r12,%rdi
  call   <partition@plt>
  mov    %rax,0x8(%rsp)
  test   %rax,%rax
  jne    L130
L195:
  mov    0x8(%rsp),%r14
  add    $0x1,%r14
  cmp    %r14,0x10(%rsp)
  ja     L58
  jmp    L94
L130:
  sub    $0x1,%rax
  mov    %rax,(%rsp)
  cmp    %r14,%rax
  jbe    L195
L17:
  mov    (%rsp),%r8
  mov    %r14,%rcx
  mov    %rbp,%rdx
  mov    %r15,%rsi
  mov    %r12,%rdi
  call   <partition@plt>
  mov    %rax,%rbx
  test   %rax,%rax
  jne    L321
L318:
  lea    0x1(%rbx),%r14
  cmp    %r14,(%rsp)
  ja     L17
  jmp    L195
  cs nopw 0x0(%rax,%rax,1)
L321:
  lea    -0x1(%rax),%r13
  cmp    %r14,%r13
  jbe    L318
  mov    %rax,0x70(%rsp)
L239:
  mov    %r13,%r8
  mov    %r14,%rcx
  mov    %rbp,%rdx
  mov    %r15,%rsi
  mov    %r12,%rdi
  call   <partition@plt>
  mov    %rax,%rbx
  test   %rax,%rax
  jne    L31
L30:
  lea    0x1(%rbx),%r14
  cmp    %r14,%r13
  ja     L239
  mov    0x70(%rsp),%rbx
  jmp    L318
  nopw   0x0(%rax,%rax,1)
L31:
  lea    -0x1(%rax),%r10
  cmp    %r14,%r10
  jbe    L30
  mov    %rax,0x68(%rsp)
  mov    %r10,%rbx
L204:
  mov    %rbx,%r8
  mov    %r14,%rcx
  mov    %rbp,%rdx
  mov    %r15,%rsi
  mov    %r12,%rdi
  call   <partition@plt>
  test   %rax,%rax
  jne    L297
L156:
  lea    0x1(%rax),%r14
  cmp    %r14,%rbx
  ja     L204
  mov    0x68(%rsp),%rbx
  jmp    L30
  nopw   0x0(%rax,%rax,1)
L297:
  lea    -0x1(%rax),%r8
  mov    %r14,%rcx
  mov    %rbp,%rdx
  mov    %r15,%rsi
  mov    %r12,%rdi
  mov    %rax,0x78(%rsp)
  call   <qsort_r>
  mov    0x78(%rsp),%rax
  jmp    L156
```

assistant: ```c
void qsort_r(void *base, size_t size, int (*compar)(const void *, const void *), size_t low, size_t high) {
  size_t pivot;
  if (high > low) {
    pivot = partition(base, size, compar, low, high);
    if (pivot > 0)
      qsort_r(base, size, compar, low, pivot - 1);
    qsort_r(base, size, compar, pivot + 1, high);
  }
}
```