user: 请将以下的汇编代码转换成C语言代码:

```asm
<qs>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %rdx,-0x48(%rbp)
  mov    -0x40(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x48(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x40(%rbp),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdx
  shr    $0x3f,%rdx
  add    %rdx,%rax
  sar    %rax
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    0x8(%rax),%rax
  mov    %rax,-0x18(%rbp)
  jmp    L32
L68:
  addq   $0x1,-0x28(%rbp)
L32:
  mov    -0x28(%rbp),%rax
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    0x8(%rax),%rax
  cmp    %rax,-0x18(%rbp)
  jle    L85
  mov    -0x28(%rbp),%rax
  cmp    -0x48(%rbp),%rax
  jl     L68
  jmp    L85
L11:
  subq   $0x1,-0x20(%rbp)
L85:
  mov    -0x20(%rbp),%rax
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    0x8(%rax),%rax
  cmp    %rax,-0x18(%rbp)
  jge    L70
  mov    -0x20(%rbp),%rax
  cmp    -0x40(%rbp),%rax
  jg     L11
L70:
  mov    -0x28(%rbp),%rax
  cmp    -0x20(%rbp),%rax
  jg     L83
  mov    -0x28(%rbp),%rax
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    0x8(%rax),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x28(%rbp),%rax
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x20(%rbp),%rax
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    -0x28(%rbp),%rdx
  mov    %rdx,%rcx
  shl    $0x4,%rcx
  mov    -0x38(%rbp),%rdx
  add    %rcx,%rdx
  mov    0x8(%rax),%rax
  mov    %rax,0x8(%rdx)
  mov    -0x20(%rbp),%rax
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    -0x28(%rbp),%rdx
  mov    %rdx,%rcx
  shl    $0x4,%rcx
  mov    -0x38(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%rax
  mov    %rax,(%rdx)
  mov    -0x20(%rbp),%rax
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rax,%rdx
  mov    -0x10(%rbp),%rax
  mov    %rax,0x8(%rdx)
  mov    -0x20(%rbp),%rax
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rax,%rdx
  mov    -0x8(%rbp),%rax
  mov    %rax,(%rdx)
  addq   $0x1,-0x28(%rbp)
  subq   $0x1,-0x20(%rbp)
L83:
  mov    -0x28(%rbp),%rax
  cmp    -0x20(%rbp),%rax
  jle    L32
  mov    -0x40(%rbp),%rax
  cmp    -0x20(%rbp),%rax
  jge    L55
  mov    -0x20(%rbp),%rdx
  mov    -0x40(%rbp),%rcx
  mov    -0x38(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <qs>
L55:
  mov    -0x28(%rbp),%rax
  cmp    -0x48(%rbp),%rax
  jge    L33
  mov    -0x48(%rbp),%rdx
  mov    -0x28(%rbp),%rcx
  mov    -0x38(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <qs>
L33:
  nop
  leave
  ret
```

assistant: ```c
void qs(long daten[][2], long links, long rechts) {
  long i, j;
  long x, y, z;
  i = links;
  j = rechts;
  x = daten[(links + rechts) / 2][1];
  do {
    while (daten[i][1] < x && i < rechts)
      i++;
    while (x < daten[j][1] && j > links)
      j--;
    if (i <= j) {
      y = daten[i][1];
      z = daten[i][0];
      daten[i][1] = daten[j][1];
      daten[i][0] = daten[j][0];
      daten[j][1] = y;
      daten[j][0] = z;
      i++;
      j--;
    }
  } while (i <= j);
  if (links < j)
    qs(daten, links, j);
  if (i < rechts)
    qs(daten, i, rechts);
}
```