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

```asm
<quick_sort4>:
  endbr64
  push   %r15
  lea    -0x8(%rdi,%rdx,8),%rax
  mov    %rdi,%r15
  push   %r14
  push   %r13
  push   %r12
  mov    %rsi,%r12
  push   %rbp
  push   %rbx
  sub    $0xd8,%rsp
  mov    %rdx,0xa0(%rsp)
  mov    %rax,0xa8(%rsp)
L119:
  lea    (%r15,%r12,8),%r11
  mov    0xa8(%rsp),%r9
  mov    0xa0(%rsp),%rbp
  mov    %r12,%rdi
  mov    (%r11),%rsi
L238:
  mov    (%r9),%r10
  lea    -0x1(%rbp),%rbx
  cmp    %rsi,%r10
  ja     L747
  lea    0x1(%rdi),%rdx
  lea    (%r15,%rdx,8),%rax
  jmp    L430
L390:
  add    $0x1,%rdx
L430:
  mov    %rax,%r8
  mov    (%rax),%rcx
  add    $0x8,%rax
  mov    %rdx,%rdi
  cmp    %rsi,%rcx
  jb     L390
  cmp    %rdx,%rbx
  jbe    L170
  mov    %r10,(%r8)
  mov    %rcx,(%r9)
L747:
  sub    $0x8,%r9
  mov    %rbx,%rbp
  jmp    L238
L170:
  mov    %r12,%rax
  mov    %r10,(%r11)
  add    $0x1,%rax
  mov    %rbp,0x50(%rsp)
  mov    %rbx,0x80(%rsp)
  mov    %rsi,(%r9)
  mov    %rax,(%rsp)
  cmp    %rbx,%rax
  jb     L470
L588:
  mov    0x50(%rsp),%rax
  add    $0x1,%rax
  cmp    0xa0(%rsp),%rax
  jae    L585
  mov    0x50(%rsp),%r12
  jmp    L119
L470:
  lea    -0x10(%r15,%rbp,8),%rax
  mov    %rax,0xb0(%rsp)
L202:
  lea    (%r15,%r12,8),%r11
  mov    0xb0(%rsp),%r9
  mov    0x80(%rsp),%rbp
  mov    %r12,%rdi
  mov    (%r11),%rsi
  nopl   (%rax)
L705:
  mov    (%r9),%r10
  lea    -0x1(%rbp),%rbx
  cmp    %r10,%rsi
  jb     L381
  lea    0x1(%rdi),%rdx
  lea    (%r15,%rdx,8),%rax
  jmp    L46
  xchg   %ax,%ax
L427:
  add    $0x1,%rdx
L46:
  mov    %rax,%r8
  mov    (%rax),%rcx
  add    $0x8,%rax
  mov    %rdx,%rdi
  cmp    %rcx,%rsi
  ja     L427
  cmp    %rdx,%rbx
  jbe    L489
  mov    %r10,(%r8)
  mov    %rcx,(%r9)
L381:
  sub    $0x8,%r9
  mov    %rbx,%rbp
  jmp    L705
L489:
  mov    (%rsp),%rax
  mov    %r10,(%r11)
  mov    %rbp,0x58(%rsp)
  mov    %rbx,0x88(%rsp)
  mov    %rsi,(%r9)
  cmp    %rax,%rbx
  ja     L262
L247:
  mov    0x58(%rsp),%rax
  add    $0x1,%rax
  cmp    %rax,0x80(%rsp)
  jbe    L588
  mov    %rax,(%rsp)
  mov    0x58(%rsp),%r12
  jmp    L202
L262:
  lea    -0x10(%r15,%rbp,8),%rax
  mov    %rax,0xb8(%rsp)
L93:
  lea    (%r15,%r12,8),%r11
  mov    0xb8(%rsp),%r9
  mov    0x88(%rsp),%rbp
  mov    %r12,%rdi
  mov    (%r11),%rsi
  nopw   0x0(%rax,%rax,1)
L483:
  mov    (%r9),%r10
  lea    -0x1(%rbp),%rbx
  cmp    %r10,%rsi
  jb     L69
  lea    0x1(%rdi),%rdx
  lea    (%r15,%rdx,8),%rax
  jmp    L474
  xchg   %ax,%ax
L485:
  add    $0x1,%rdx
L474:
  mov    %rax,%r8
  mov    (%rax),%rcx
  add    $0x8,%rax
  mov    %rdx,%rdi
  cmp    %rcx,%rsi
  ja     L485
  cmp    %rdx,%rbx
  jbe    L245
  mov    %r10,(%r8)
  mov    %rcx,(%r9)
L69:
  sub    $0x8,%r9
  mov    %rbx,%rbp
  jmp    L483
L245:
  mov    (%rsp),%rax
  mov    %r10,(%r11)
  mov    %rbp,0x60(%rsp)
  mov    %rbx,0x90(%rsp)
  mov    %rsi,(%r9)
  cmp    %rax,%rbx
  ja     L15
L242:
  mov    0x60(%rsp),%rax
  add    $0x1,%rax
  cmp    %rax,0x88(%rsp)
  jbe    L247
  mov    %rax,(%rsp)
  mov    0x60(%rsp),%r12
  jmp    L93
L15:
  lea    -0x10(%r15,%rbp,8),%rax
  mov    %rax,0xc0(%rsp)
L39:
  lea    (%r15,%r12,8),%r11
  mov    0xc0(%rsp),%r9
  mov    0x90(%rsp),%rbp
  mov    %r12,%rdi
  mov    (%r11),%rsi
  nopw   0x0(%rax,%rax,1)
L625:
  mov    (%r9),%r10
  lea    -0x1(%rbp),%rbx
  cmp    %r10,%rsi
  jb     L322
  lea    0x1(%rdi),%rdx
  lea    (%r15,%rdx,8),%rax
  jmp    L575
  xchg   %ax,%ax
L363:
  add    $0x1,%rdx
L575:
  mov    %rax,%r8
  mov    (%rax),%rcx
  add    $0x8,%rax
  mov    %rdx,%rdi
  cmp    %rcx,%rsi
  ja     L363
  cmp    %rdx,%rbx
  jbe    L120
  mov    %r10,(%r8)
  mov    %rcx,(%r9)
L322:
  sub    $0x8,%r9
  mov    %rbx,%rbp
  jmp    L625
L120:
  mov    (%rsp),%rax
  mov    %r10,(%r11)
  mov    %rbp,0x68(%rsp)
  mov    %rbx,0x48(%rsp)
  mov    %rsi,(%r9)
  cmp    %rax,%rbx
  ja     L732
L128:
  mov    0x68(%rsp),%rax
  add    $0x1,%rax
  cmp    %rax,0x90(%rsp)
  jbe    L242
  mov    %rax,(%rsp)
  mov    0x68(%rsp),%r12
  jmp    L39
L732:
  lea    -0x10(%r15,%rbp,8),%rax
  mov    %rax,0x98(%rsp)
L667:
  lea    (%r15,%r12,8),%r11
  mov    0x98(%rsp),%r9
  mov    0x48(%rsp),%rbp
  mov    %r12,%rdi
  mov    (%r11),%rsi
  nopl   0x0(%rax)
L131:
  mov    (%r9),%r10
  lea    -0x1(%rbp),%rbx
  cmp    %r10,%rsi
  jb     L56
  lea    0x1(%rdi),%rdx
  lea    (%r15,%rdx,8),%rax
  jmp    L620
  cs nopw 0x0(%rax,%rax,1)
L478:
  add    $0x1,%rdx
L620:
  mov    %rax,%r8
  mov    (%rax),%rcx
  add    $0x8,%rax
  mov    %rdx,%rdi
  cmp    %rcx,%rsi
  ja     L478
  cmp    %rdx,%rbx
  jbe    L149
  mov    %r10,(%r8)
  mov    %rcx,(%r9)
L56:
  sub    $0x8,%r9
  mov    %rbx,%rbp
  jmp    L131
L149:
  mov    (%rsp),%rax
  mov    %r10,(%r11)
  mov    %rbp,0x38(%rsp)
  mov    %rbx,0x30(%rsp)
  mov    %rsi,(%r9)
  cmp    %rax,%rbx
  ja     L241
L347:
  mov    0x38(%rsp),%rax
  add    $0x1,%rax
  cmp    %rax,0x48(%rsp)
  jbe    L128
  mov    %rax,(%rsp)
  mov    0x38(%rsp),%r12
  jmp    L667
L241:
  lea    -0x10(%r15,%rbp,8),%rax
  mov    %rax,0x70(%rsp)
L432:
  lea    (%r15,%r12,8),%r11
  mov    0x70(%rsp),%r9
  mov    0x30(%rsp),%rbp
  mov    %r12,%rdi
  mov    (%r11),%rsi
  nopl   0x0(%rax,%rax,1)
L573:
  mov    (%r9),%r10
  lea    -0x1(%rbp),%rbx
  cmp    %r10,%rsi
  jb     L703
  lea    0x1(%rdi),%rdx
  lea    (%r15,%rdx,8),%rax
  jmp    L706
  xchg   %ax,%ax
L115:
  add    $0x1,%rdx
L706:
  mov    %rax,%r8
  mov    (%rax),%rcx
  add    $0x8,%rax
  mov    %rdx,%rdi
  cmp    %rcx,%rsi
  ja     L115
  cmp    %rdx,%rbx
  jbe    L320
  mov    %r10,(%r8)
  mov    %rcx,(%r9)
L703:
  sub    $0x8,%r9
  mov    %rbx,%rbp
  jmp    L573
L320:
  mov    (%rsp),%rax
  mov    %r10,(%r11)
  mov    %rbp,0x20(%rsp)
  mov    %rbx,0x18(%rsp)
  mov    %rsi,(%r9)
  cmp    %rax,%rbx
  ja     L434
L635:
  mov    0x20(%rsp),%rax
  add    $0x1,%rax
  cmp    %rax,0x30(%rsp)
  jbe    L347
  mov    %rax,(%rsp)
  mov    0x20(%rsp),%r12
  jmp    L432
L434:
  lea    -0x10(%r15,%rbp,8),%rax
  mov    %rax,0x40(%rsp)
L24:
  lea    (%r15,%r12,8),%r11
  mov    0x40(%rsp),%r9
  mov    0x18(%rsp),%r14
  mov    %r12,%rdi
  mov    (%r11),%rsi
  nopl   0x0(%rax,%rax,1)
L55:
  mov    (%r9),%r10
  lea    -0x1(%r14),%r13
  cmp    %r10,%rsi
  jb     L734
  lea    0x1(%rdi),%rdx
  lea    (%r15,%rdx,8),%rax
  jmp    L713
  xchg   %ax,%ax
L702:
  add    $0x1,%rdx
L713:
  mov    %rax,%r8
  mov    (%rax),%rcx
  add    $0x8,%rax
  mov    %rdx,%rdi
  cmp    %rcx,%rsi
  ja     L702
  cmp    %rdx,%r13
  jbe    L232
  mov    %r10,(%r8)
  mov    %rcx,(%r9)
L734:
  sub    $0x8,%r9
  mov    %r13,%r14
  jmp    L55
L232:
  mov    %r10,(%r11)
  mov    %rsi,(%r9)
  cmp    (%rsp),%r13
  ja     L541
L632:
  lea    0x1(%r14),%rax
  cmp    %rax,0x18(%rsp)
  jbe    L635
  mov    %rax,(%rsp)
  mov    %r14,%r12
  jmp    L24
L541:
  lea    -0x10(%r15,%r14,8),%rax
  mov    %r14,0xc8(%rsp)
  mov    %rax,0x28(%rsp)
  mov    %r13,0x8(%rsp)
  mov    %r12,%r13
L105:
  lea    (%r15,%r13,8),%r11
  mov    0x28(%rsp),%r9
  mov    0x8(%rsp),%r12
  mov    %r13,%rdi
  mov    (%r11),%rsi
  nopl   0x0(%rax)
L22:
  mov    (%r9),%r10
  lea    -0x1(%r12),%rbp
  cmp    %r10,%rsi
  jb     L196
  lea    0x1(%rdi),%rdx
  lea    (%r15,%rdx,8),%rax
  jmp    L530
  nopw   0x0(%rax,%rax,1)
L553:
  add    $0x1,%rdx
L530:
  mov    %rax,%r8
  mov    (%rax),%rcx
  add    $0x8,%rax
  mov    %rdx,%rdi
  cmp    %rcx,%rsi
  ja     L553
  cmp    %rdx,%rbp
  jbe    L326
  mov    %r10,(%r8)
  mov    %rcx,(%r9)
L196:
  sub    $0x8,%r9
  mov    %rbp,%r12
  jmp    L22
L326:
  mov    %r10,(%r11)
  mov    %rsi,(%r9)
  cmp    (%rsp),%rbp
  ja     L240
  lea    0x1(%r12),%rax
  cmp    %rax,0x8(%rsp)
  jbe    L296
L524:
  mov    %rax,(%rsp)
  mov    %r12,%r13
  jmp    L105
L240:
  lea    -0x10(%r15,%r12,8),%rax
  mov    %r12,0x78(%rsp)
  mov    (%rsp),%r12
  mov    %rax,0x10(%rsp)
L277:
  lea    (%r15,%r13,8),%r14
  mov    0x10(%rsp),%r9
  mov    %rbp,%rbx
  mov    %r13,%rdi
  mov    (%r14),%rsi
  nopw   0x0(%rax,%rax,1)
L153:
  mov    (%r9),%r11
  lea    -0x1(%rbx),%r10
  cmp    %r11,%rsi
  jb     L281
  lea    0x1(%rdi),%rdx
  lea    (%r15,%rdx,8),%rax
  jmp    L692
  cs nopw 0x0(%rax,%rax,1)
L669:
  add    $0x1,%rdx
L692:
  mov    %rax,%r8
  mov    (%rax),%rcx
  add    $0x8,%rax
  mov    %rdx,%rdi
  cmp    %rcx,%rsi
  ja     L669
  cmp    %rdx,%r10
  jbe    L313
  mov    %r11,(%r8)
  mov    %rcx,(%r9)
L281:
  sub    $0x8,%r9
  mov    %r10,%rbx
  jmp    L153
  nopw   0x0(%rax,%rax,1)
L313:
  mov    %r11,(%r14)
  mov    %rsi,(%r9)
  cmp    %r12,%r10
  ja     L614
L198:
  lea    0x1(%rbx),%r12
  cmp    %r12,%rbp
  jbe    L634
  mov    %rbx,%r13
  jmp    L277
L634:
  mov    0x78(%rsp),%r12
  lea    0x1(%r12),%rax
  cmp    %rax,0x8(%rsp)
  ja     L524
L296:
  mov    0xc8(%rsp),%r14
  jmp    L632
L614:
  mov    %r10,%rdx
  mov    %r13,%rsi
  mov    %r15,%rdi
  call   <quick_sort4>
  jmp    L198
L585:
  add    $0xd8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
void quick_sort4(int32_t *a, int32_t low, int32_t high) {
  int32_t i, j, p, aux;
  p = a[low];
  i = low;
  j = high;
  for (;;) {
    do {
      j--;
    } while (a[j] > p);
    do {
      i++;
    } while (a[i] < p);
    if (i >= j)
      break;
    aux = a[i];
    a[i] = a[j];
    a[j] = aux;
  }
  a[low] = a[j];
  a[j] = p;
  if (j > low + 1)
    quick_sort4(a, low, j);
  j++;
  if (high > j + 1)
    quick_sort4(a, j, high);
}
```