user: 下面的汇编指令对应的C源代码是什么:

```asm
<quicksortsubrange>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    -0x30(%rbp),%rax
  cmp    -0x38(%rbp),%rax
  jl     L87
  mov    $0x0,%eax
  jmp    L7
L87:
  mov    -0x38(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x38(%rbp),%rax
  sub    $0x1,%rax
  mov    %rax,-0x18(%rbp)
  jmp    L89
L97:
  addq   $0x1,-0x20(%rbp)
L44:
  mov    -0x20(%rbp),%rax
  cmp    -0x18(%rbp),%rax
  jge    L36
  mov    -0x20(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    -0x10(%rbp),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <mystrcmp@plt>
  test   %rax,%rax
  js     L97
  jmp    L36
L84:
  subq   $0x1,-0x18(%rbp)
L36:
  mov    -0x20(%rbp),%rax
  cmp    -0x18(%rbp),%rax
  jge    L0
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    -0x10(%rbp),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <mystrcmp@plt>
  test   %rax,%rax
  jns    L84
L0:
  mov    -0x20(%rbp),%rax
  cmp    -0x18(%rbp),%rax
  jge    L89
  mov    -0x20(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    -0x20(%rbp),%rdx
  lea    0x0(,%rdx,8),%rcx
  mov    -0x28(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%rax
  mov    %rax,(%rdx)
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  mov    -0x8(%rbp),%rax
  mov    %rax,(%rdx)
L89:
  mov    -0x20(%rbp),%rax
  cmp    -0x18(%rbp),%rax
  jl     L44
  mov    -0x20(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    -0x38(%rbp),%rdx
  lea    0x0(,%rdx,8),%rcx
  mov    -0x28(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%rax
  mov    %rax,(%rdx)
  mov    -0x20(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  mov    -0x10(%rbp),%rax
  mov    %rax,(%rdx)
  mov    -0x20(%rbp),%rax
  lea    -0x1(%rax),%rdx
  mov    -0x30(%rbp),%rcx
  mov    -0x28(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <quicksortsubrange>
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    -0x38(%rbp),%rdx
  mov    -0x28(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <quicksortsubrange>
L7:
  leave
  ret
```

assistant: ```c
long quicksortsubrange(char **a, long left, long right) {
  if (left >= right) {
    return 0;
  }
  char *x;
  x = a[right];
  long l;
  l = left;
  long g;
  g = right - 1;
  while (l < g) {
    while (l < g && mystrcmp(a[l], x) < 0) {
      l = l + 1;
    }
    while (l < g && mystrcmp(a[g], x) >= 0) {
      g = g - 1;
    }
    if (l < g) {
      long tmp;
      tmp = a[l];
      a[l] = a[g];
      a[g] = tmp;
    }
  }
  a[right] = a[l];
  a[l] = x;
  quicksortsubrange(a, left, l - 1);
  quicksortsubrange(a, g + 1, right);
}
```