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    L70
  mov    %rdx,%r14
  mov    %rcx,%r15
L97:
  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    L82
  mov    %rbx,0x68(%rsp)
  mov    %rax,0x40(%rsp)
L155:
  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    L16
  mov    %rbx,0x70(%rsp)
  mov    %rax,0x48(%rsp)
L172:
  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    L13
  mov    %rbx,0x78(%rsp)
  mov    %rax,0x50(%rsp)
L141:
  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    L32
  mov    %r12,%rbp
L14:
  mov    %r15,%rcx
  mov    %r14,%rdx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  call   <partition@plt>
  mov    %rax,%r12
  cmp    $0x1,%rax
  jbe    L83
  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
L112:
  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    L66
  mov    %rbx,0x38(%rsp)
  mov    %r12,%r15
  mov    %r13,%rbp
  mov    %rax,0x18(%rsp)
L122:
  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    L136
  mov    %r14,0x60(%rsp)
  mov    %rbp,%r14
L72:
  mov    %r14,%rcx
  mov    %r15,%rdx
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <partition@plt>
  mov    %rax,%rbx
  cmp    $0x1,%rax
  jbe    L113
  mov    %r13,%rdi
  mov    %r14,%rcx
  mov    %rax,%r8
  mov    %r13,%r14
  mov    %rdi,%rbx
  mov    %r12,%r13
  mov    %rax,%r12
L116:
  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     L116
  mov    %r12,%rbx
  mov    %r13,%r12
  mov    %r14,%r13
  mov    %rcx,%r14
L113:
  sub    %rbx,%r12
  add    $0x1,%rbx
  imul   %r15,%rbx
  sub    $0x1,%r12
  add    %rbx,%r13
  cmp    $0x1,%r12
  ja     L72
  mov    %r14,%rbp
  mov    0x60(%rsp),%r14
L136:
  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     L122
  mov    %r15,%r12
  mov    %rbp,%r13
L66:
  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     L112
  mov    %r12,%r14
  mov    %r13,%r15
  mov    0x30(%rsp),%rbp
  mov    0x20(%rsp),%r12
  mov    0x28(%rsp),%r13
L83:
  lea    0x1(%r12),%rax
  sub    %r12,%r13
  imul   %r14,%rax
  sub    $0x1,%r13
  add    %rax,%rbp
  cmp    $0x1,%r13
  ja     L14
L32:
  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     L141
L13:
  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     L172
L16:
  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     L155
L82:
  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     L97
L70:
  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);
  }
}
```