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

```asm
<permutation>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x48,%rsp
  mov    %esi,0x28(%rsp)
  cmp    %edx,%esi
  je     L38
  jge    L27
  lea    0x1(%rsi),%ecx
  mov    %esi,%eax
  mov    %esi,0x2c(%rsp)
  lea    0x5(%rsi),%r15d
  mov    %ecx,0x24(%rsp)
  lea    0x2(%rsi),%ecx
  add    $0x9,%eax
  lea    0x6(%rsi),%r13d
  mov    %ecx,0x30(%rsp)
  lea    0x3(%rsi),%ecx
  mov    %r13d,%r14d
  mov    %edx,%r12d
  mov    %ecx,0x1c(%rsp)
  lea    0x4(%rsi),%ecx
  mov    %r15d,%r13d
  mov    %rdi,%r15
  mov    %ecx,0x8(%rsp)
  lea    0x7(%rsi),%ecx
  mov    %ecx,0xc(%rsp)
  lea    0x8(%rsi),%ecx
  mov    %ecx,0x3c(%rsp)
  mov    %eax,0x10(%rsp)
L168:
  mov    0x2c(%rsp),%edx
  mov    0x28(%rsp),%esi
  mov    %r15,%rdi
  call   <swap@plt>
  mov    0x24(%rsp),%eax
  cmp    %r12d,%eax
  je     L153
  mov    %eax,0x34(%rsp)
  jge    L11
  mov    %r14d,%eax
  mov    %r13d,%r14d
  mov    %eax,%r13d
L219:
  mov    0x34(%rsp),%edx
  mov    0x24(%rsp),%esi
  mov    %r15,%rdi
  call   <swap@plt>
  mov    0x30(%rsp),%eax
  cmp    %eax,%r12d
  je     L92
  mov    %eax,0x38(%rsp)
  jle    L189
L23:
  mov    0x38(%rsp),%edx
  mov    0x30(%rsp),%esi
  mov    %r15,%rdi
  call   <swap@plt>
  mov    0x1c(%rsp),%eax
  cmp    %eax,%r12d
  je     L293
  mov    %eax,0x14(%rsp)
  jle    L34
L26:
  mov    0x14(%rsp),%edx
  mov    0x1c(%rsp),%esi
  mov    %r15,%rdi
  call   <swap@plt>
  mov    0x8(%rsp),%eax
  cmp    %eax,%r12d
  je     L300
  mov    %eax,0x4(%rsp)
  jle    L287
L14:
  mov    0x4(%rsp),%edx
  mov    0x8(%rsp),%esi
  mov    %r15,%rdi
  call   <swap@plt>
  cmp    %r14d,%r12d
  je     L90
  mov    %r14d,%ebx
  jle    L203
  mov    %r14d,(%rsp)
L284:
  mov    (%rsp),%esi
  mov    %ebx,%edx
  mov    %r15,%rdi
  call   <swap@plt>
  cmp    %r13d,%r12d
  je     L341
  mov    %r13d,%ebp
  jle    L328
  mov    %ebx,0x20(%rsp)
  mov    0x3c(%rsp),%ebx
L243:
  mov    %ebp,%edx
  mov    %r13d,%esi
  mov    %r15,%rdi
  call   <swap@plt>
  mov    0xc(%rsp),%eax
  cmp    %eax,%r12d
  je     L5
  mov    %eax,0x18(%rsp)
  jle    L233
L165:
  mov    0x18(%rsp),%edx
  mov    0xc(%rsp),%esi
  mov    %r15,%rdi
  call   <swap@plt>
  cmp    %ebx,%r12d
  je     L271
  mov    %ebx,%r14d
  jle    L335
L146:
  mov    %r14d,%edx
  mov    %ebx,%esi
  mov    %r15,%rdi
  call   <swap@plt>
  mov    0x10(%rsp),%esi
  mov    %r12d,%edx
  mov    %r15,%rdi
  call   <permutation>
  mov    %r14d,%esi
  mov    %ebx,%edx
  mov    %r15,%rdi
  call   <swap@plt>
  add    $0x1,%r14d
  cmp    %r14d,%r12d
  jg     L146
L335:
  mov    0x18(%rsp),%r14d
  mov    0xc(%rsp),%edx
  mov    %r15,%rdi
  mov    %r14d,%esi
  call   <swap@plt>
  mov    %r14d,%eax
  add    $0x1,%eax
  mov    %eax,0x18(%rsp)
  cmp    %eax,%r12d
  jg     L165
L233:
  mov    %ebp,%esi
  mov    %r13d,%edx
  mov    %r15,%rdi
  add    $0x1,%ebp
  call   <swap@plt>
  cmp    %ebp,%r12d
  jg     L243
  mov    0x20(%rsp),%ebx
L328:
  mov    (%rsp),%edx
  mov    %ebx,%esi
  mov    %r15,%rdi
  add    $0x1,%ebx
  call   <swap@plt>
  cmp    %ebx,%r12d
  jg     L284
  mov    (%rsp),%r14d
L203:
  mov    0x4(%rsp),%ebx
  mov    0x8(%rsp),%edx
  mov    %r15,%rdi
  mov    %ebx,%esi
  call   <swap@plt>
  mov    %ebx,%eax
  add    $0x1,%eax
  mov    %eax,0x4(%rsp)
  cmp    %eax,%r12d
  jg     L14
L287:
  mov    0x14(%rsp),%ebx
  mov    0x1c(%rsp),%edx
  mov    %r15,%rdi
  mov    %ebx,%esi
  call   <swap@plt>
  mov    %ebx,%eax
  add    $0x1,%eax
  mov    %eax,0x14(%rsp)
  cmp    %eax,%r12d
  jg     L26
L34:
  mov    0x38(%rsp),%ebx
  mov    0x30(%rsp),%edx
  mov    %r15,%rdi
  mov    %ebx,%esi
  call   <swap@plt>
  mov    %ebx,%eax
  add    $0x1,%eax
  mov    %eax,0x38(%rsp)
  cmp    %eax,%r12d
  jg     L23
L189:
  mov    0x34(%rsp),%ebx
  mov    0x24(%rsp),%edx
  mov    %r15,%rdi
  mov    %ebx,%esi
  call   <swap@plt>
  mov    %ebx,%eax
  add    $0x1,%eax
  mov    %eax,0x34(%rsp)
  cmp    %eax,%r12d
  jne    L219
  mov    %r13d,%eax
  mov    %r14d,%r13d
  mov    %eax,%r14d
L11:
  mov    0x2c(%rsp),%ebx
  mov    0x28(%rsp),%edx
  mov    %r15,%rdi
  mov    %ebx,%esi
  call   <swap@plt>
  mov    %ebx,%eax
  add    $0x1,%eax
  mov    %eax,0x2c(%rsp)
  cmp    %eax,%r12d
  jne    L168
L27:
  add    $0x48,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L5:
  mov    %r12d,%esi
  mov    %r15,%rdi
  call   <print_list@plt>
  jmp    L233
L341:
  mov    %r12d,%esi
  mov    %r15,%rdi
  call   <print_list@plt>
  jmp    L328
  nopw   0x0(%rax,%rax,1)
L271:
  mov    %r12d,%esi
  mov    %r15,%rdi
  call   <print_list@plt>
  jmp    L335
L90:
  mov    %r12d,%esi
  mov    %r15,%rdi
  call   <print_list@plt>
  jmp    L203
L300:
  mov    %r12d,%esi
  mov    %r15,%rdi
  call   <print_list@plt>
  jmp    L287
L293:
  mov    %r12d,%esi
  mov    %r15,%rdi
  call   <print_list@plt>
  jmp    L34
L92:
  mov    %r12d,%esi
  mov    %r15,%rdi
  call   <print_list@plt>
  jmp    L189
L153:
  mov    %eax,%esi
  mov    %r15,%rdi
  call   <print_list@plt>
  jmp    L11
L38:
  add    $0x48,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1070 <print_list@plt>
```

assistant: ```c
void permutation(int *list, int start, int len) {
  if (start == len) {
    print_list(list, len);
    return;
  }
  for (int i = start; i < len; i++) {
    swap(list, start, i);
    permutation(list, start + 1, len);
    swap(list, i, start);
  }
}
```