user: 请从给定的汇编指令推导出C源代码：

```asm
<qsort>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0xc8,%rsp
  mov    %rdi,0x80(%rsp)
  mov    %rsi,0x58(%rsp)
  cmp    $0x1,%rsi
  jbe    L126
  mov    %rdx,%r14
  mov    %rcx,%r15
L37:
  mov    0x80(%rsp),%rbx
  mov    0x58(%rsp),%rsi
  mov    %r15,%rcx
  mov    %r14,%rdx
  mov    %rbx,%rdi
  call   <partition@plt>
  mov    %rax,0x88(%rsp)
  cmp    $0x1,%rax
  jbe    L162
  mov    %rbx,0x68(%rsp)
  mov    %rax,0x40(%rsp)
L15:
  mov    0x68(%rsp),%rbx
  mov    0x40(%rsp),%rsi
  mov    %r15,%rcx
  mov    %r14,%rdx
  mov    %rbx,%rdi
  call   <partition@plt>
  mov    %rax,0x90(%rsp)
  cmp    $0x1,%rax
  jbe    L38
  mov    %rbx,0x70(%rsp)
  mov    %rax,0x48(%rsp)
L84:
  mov    0x70(%rsp),%rbx
  mov    0x48(%rsp),%rsi
  mov    %r15,%rcx
  mov    %r14,%rdx
  mov    %rbx,%rdi
  call   <partition@plt>
  mov    %rax,0x98(%rsp)
  cmp    $0x1,%rax
  jbe    L130
  mov    %rbx,0x78(%rsp)
  mov    %rax,0x50(%rsp)
L156:
  mov    0x78(%rsp),%r12
  mov    0x50(%rsp),%rsi
  mov    %r15,%rcx
  mov    %r14,%rdx
  mov    %r12,%rdi
  call   <partition@plt>
  mov    %rax,0xa0(%rsp)
  mov    %rax,%r13
  cmp    $0x1,%rax
  jbe    L26
  mov    %r12,%rbp
L94:
  mov    %r15,%rcx
  mov    %r14,%rdx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  call   <partition@plt>
  mov    %rax,%r12
  cmp    $0x1,%rax
  jbe    L115
  mov    %rbp,0x10(%rsp)
  mov    %r14,%r12
  mov    %rax,0x8(%rsp)
  mov    %rax,0x20(%rsp)
  mov    %rbp,0x30(%rsp)
  mov    %r13,0x28(%rsp)
  mov    %r15,%r13
L65:
  mov    0x10(%rsp),%rbx
  mov    0x8(%rsp),%rsi
  mov    %r13,%rcx
  mov    %r12,%rdx
  mov    %rbx,%rdi
  call   <partition@plt>
  mov    %rax,%r14
  cmp    $0x1,%rax
  jbe    L110
  mov    %rbx,0x38(%rsp)
  mov    %r12,%r15
  mov    %r13,%rbp
  mov    %rax,0x18(%rsp)
L111:
  mov    0x38(%rsp),%r13
  mov    0x18(%rsp),%rsi
  mov    %rbp,%rcx
  mov    %r15,%rdx
  mov    %r13,%rdi
  call   <partition@plt>
  mov    %rax,0xa8(%rsp)
  mov    %rax,%r12
  cmp    $0x1,%rax
  jbe    L116
  mov    %r14,0x60(%rsp)
  mov    %rbp,%r14
L59:
  mov    %r14,%rcx
  mov    %r15,%rdx
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <partition@plt>
  mov    %rax,%rbx
  cmp    $0x1,%rax
  jbe    L141
  mov    %r13,%rdi
  mov    %r14,%rcx
  mov    %rax,%r8
  mov    %r13,%r14
  mov    %rdi,%rbx
  mov    %r12,%r13
  mov    %rax,%r12
L145:
  mov    %r8,%rsi
  mov    %rbx,%rdi
  mov    %r15,%rdx
  mov    %r8,0xb8(%rsp)
  mov    %rcx,0xb0(%rsp)
  call   <partition@plt>
  mov    0xb0(%rsp),%rcx
  mov    %rbx,%rdi
  mov    %r15,%rdx
  mov    %rax,%rbp
  mov    %rax,%rsi
  call   <qsort>
  mov    0xb8(%rsp),%r8
  lea    0x1(%rbp),%rax
  mov    0xb0(%rsp),%rcx
  imul   %r15,%rax
  sub    %rbp,%r8
  sub    $0x1,%r8
  add    %rax,%rbx
  cmp    $0x1,%r8
  ja     L145
  mov    %r12,%rbx
  mov    %r13,%r12
  mov    %r14,%r13
  mov    %rcx,%r14
L141:
  sub    %rbx,%r12
  add    $0x1,%rbx
  imul   %r15,%rbx
  sub    $0x1,%r12
  add    %rbx,%r13
  cmp    $0x1,%r12
  ja     L59
  mov    %r14,%rbp
  mov    0x60(%rsp),%r14
L116:
  mov    0x18(%rsp),%rax
  mov    0xa8(%rsp),%rdi
  sub    %rdi,%rax
  lea    -0x1(%rax),%rcx
  mov    %rdi,%rax
  add    $0x1,%rax
  mov    %rcx,0x18(%rsp)
  imul   %r15,%rax
  add    %rax,0x38(%rsp)
  cmp    $0x1,%rcx
  ja     L111
  mov    %r15,%r12
  mov    %rbp,%r13
L110:
  mov    0x8(%rsp),%rax
  sub    %r14,%rax
  lea    -0x1(%rax),%rdx
  lea    0x1(%r14),%rax
  imul   %r12,%rax
  mov    %rdx,0x8(%rsp)
  add    %rax,0x10(%rsp)
  cmp    $0x1,%rdx
  ja     L65
  mov    %r12,%r14
  mov    %r13,%r15
  mov    0x30(%rsp),%rbp
  mov    0x20(%rsp),%r12
  mov    0x28(%rsp),%r13
L115:
  lea    0x1(%r12),%rax
  sub    %r12,%r13
  imul   %r14,%rax
  sub    $0x1,%r13
  add    %rax,%rbp
  cmp    $0x1,%r13
  ja     L94
L26:
  mov    0x50(%rsp),%rax
  mov    0xa0(%rsp),%rsi
  sub    %rsi,%rax
  lea    -0x1(%rax),%rdi
  mov    %rsi,%rax
  add    $0x1,%rax
  mov    %rdi,0x50(%rsp)
  imul   %r14,%rax
  add    %rax,0x78(%rsp)
  cmp    $0x1,%rdi
  ja     L156
L130:
  mov    0x48(%rsp),%rax
  mov    0x98(%rsp),%rdi
  sub    %rdi,%rax
  lea    -0x1(%rax),%rdx
  mov    %rdi,%rax
  add    $0x1,%rax
  mov    %rdx,0x48(%rsp)
  imul   %r14,%rax
  add    %rax,0x70(%rsp)
  cmp    $0x1,%rdx
  ja     L84
L38:
  mov    0x40(%rsp),%rax
  mov    0x90(%rsp),%rsi
  sub    %rsi,%rax
  lea    -0x1(%rax),%rcx
  mov    %rsi,%rax
  add    $0x1,%rax
  mov    %rcx,0x40(%rsp)
  imul   %r14,%rax
  add    %rax,0x68(%rsp)
  cmp    $0x1,%rcx
  ja     L15
L162:
  mov    0x58(%rsp),%rax
  mov    0x88(%rsp),%rcx
  sub    %rcx,%rax
  lea    -0x1(%rax),%rdi
  mov    %rcx,%rax
  add    $0x1,%rax
  mov    %rdi,0x58(%rsp)
  imul   %r14,%rax
  add    %rax,0x80(%rsp)
  cmp    $0x1,%rdi
  ja     L37
L126:
  add    $0xc8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) {
  if (nmemb > 1) {
    size_t pivot_index = partition(base, nmemb, size, compar);
    qsort(base, pivot_index, size, compar);
    qsort(base + (pivot_index + 1) * size, nmemb - (pivot_index + 1), size, compar);
  }
}
```