user: Demonstrate the C code that generates the assembly output below:

```asm
<shellsort>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %edx,%eax
  mov    %ax,-0x24(%rbp)
  movzwl -0x24(%rbp),%eax
  mov    %eax,%edx
  shr    $0xf,%dx
  add    %edx,%eax
  sar    %ax
  mov    %ax,-0x10(%rbp)
  jmp    L64
L17:
  movzwl -0x10(%rbp),%eax
  add    $0x1,%eax
  mov    %ax,-0xe(%rbp)
  jmp    L25
L1:
  movzwl -0xe(%rbp),%eax
  movzwl -0x10(%rbp),%edx
  sub    %edx,%eax
  mov    %ax,-0xc(%rbp)
  jmp    L31
L48:
  movswq -0xc(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  movswl -0xc(%rbp),%edx
  movswl -0x10(%rbp),%eax
  add    %edx,%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  comisd %xmm1,%xmm0
  jbe    L37
  movswq -0xc(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x8(%rbp)
  movswl -0xc(%rbp),%edx
  movswl -0x10(%rbp),%eax
  add    %edx,%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  movswq -0xc(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rcx
  mov    -0x18(%rbp),%rax
  add    %rcx,%rax
  movsd  (%rdx),%xmm0
  movsd  %xmm0,(%rax)
  movswl -0xc(%rbp),%edx
  movswl -0x10(%rbp),%eax
  add    %edx,%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x8(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  movswq -0xc(%rbp),%rax
  add    %rax,%rax
  lea    -0x2(%rax),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzwl (%rax),%eax
  mov    %ax,-0xa(%rbp)
  movswl -0xc(%rbp),%edx
  movswl -0x10(%rbp),%eax
  add    %edx,%eax
  cltq
  add    %rax,%rax
  lea    -0x2(%rax),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movswq -0xc(%rbp),%rdx
  add    %rdx,%rdx
  lea    -0x2(%rdx),%rcx
  mov    -0x20(%rbp),%rdx
  add    %rcx,%rdx
  movzwl (%rax),%eax
  mov    %ax,(%rdx)
  movswl -0xc(%rbp),%edx
  movswl -0x10(%rbp),%eax
  add    %edx,%eax
  cltq
  add    %rax,%rax
  lea    -0x2(%rax),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  movzwl -0xa(%rbp),%eax
  mov    %ax,(%rdx)
L37:
  movzwl -0xc(%rbp),%eax
  movzwl -0x10(%rbp),%edx
  sub    %edx,%eax
  mov    %ax,-0xc(%rbp)
L31:
  cmpw   $0x0,-0xc(%rbp)
  jg     L48
  movzwl -0xe(%rbp),%eax
  add    $0x1,%eax
  mov    %ax,-0xe(%rbp)
L25:
  movzwl -0xe(%rbp),%eax
  cmp    -0x24(%rbp),%ax
  jle    L1
  movzwl -0x10(%rbp),%eax
  mov    %eax,%edx
  shr    $0xf,%dx
  add    %edx,%eax
  sar    %ax
  mov    %ax,-0x10(%rbp)
L64:
  cmpw   $0x0,-0x10(%rbp)
  jg     L17
  nop
  nop
  pop    %rbp
  ret
```

assistant: ```c
void shellsort(a, b, n) double *a;
short *b;
short n;
{
  short gap, i, j, itemp;
  double rtemp;
  gap = n / 2;
  while (gap > 0) {
    for (i = gap + 1; i <= n; i++) {
      j = i - gap;
      while (j > 0) {
        if (a[j - 1] > a[j + gap - 1]) {
          rtemp = a[j - 1];
          a[j - 1] = a[j + gap - 1];
          a[j + gap - 1] = rtemp;
          itemp = b[j - 1];
          b[j - 1] = b[j + gap - 1];
          b[j + gap - 1] = itemp;
        }
        j -= gap;
      }
    }
    gap /= 2;
  }
}
```