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

```asm
<print_permutations>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  mov    %edx,%r12d
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  sub    $0xf8,%rsp
  mov    %esi,0x3c(%rsp)
  test   %esi,%esi
  je     L189
  lea    0x8(%rdi),%rax
  movslq %esi,%rbx
  mov    %edx,%ebp
  mov    %rax,0xd8(%rsp)
  mov    %rbx,0x8(%rsp)
  mov    %rdi,%rbx
L89:
  mov    0x8(%rsp),%r13d
  subl   $0x1,0x3c(%rsp)
  test   %r13d,%r13d
  jle    L345
L234:
  mov    0x8(%rsp),%eax
  mov    0xd8(%rsp),%rdx
  mov    %rbx,0x80(%rsp)
  and    $0x1,%eax
  mov    %eax,0xb8(%rsp)
  mov    0x3c(%rsp),%eax
  lea    (%rdx,%rax,8),%rax
  mov    %rax,0xb0(%rsp)
L37:
  mov    0x3c(%rsp),%eax
  test   %eax,%eax
  je     L141
  movslq %eax,%rdx
  mov    %eax,0x98(%rsp)
  mov    %rdx,0x30(%rsp)
L235:
  mov    0x30(%rsp),%eax
  mov    %rbx,0x60(%rsp)
  mov    %ebp,%r15d
  subl   $0x1,0x98(%rsp)
  and    $0x1,%eax
  movl   $0x0,0x14(%rsp)
  mov    %eax,0xbc(%rsp)
L314:
  mov    0x98(%rsp),%eax
  test   %eax,%eax
  je     L281
  movslq %eax,%rdx
  mov    %eax,0x9c(%rsp)
  mov    %rdx,0x18(%rsp)
L326:
  mov    0x18(%rsp),%eax
  mov    %rbx,0x58(%rsp)
  mov    %r15d,%r14d
  subl   $0x1,0x9c(%rsp)
  and    $0x1,%eax
  movl   $0x0,0x20(%rsp)
  mov    %eax,0xc0(%rsp)
L133:
  mov    0x9c(%rsp),%eax
  test   %eax,%eax
  je     L274
  movslq %eax,%r15
  mov    %eax,0xa0(%rsp)
  mov    %r15,0x40(%rsp)
L210:
  mov    0x40(%rsp),%eax
  mov    %rbx,0x78(%rsp)
  mov    %r14d,%r15d
  subl   $0x1,0xa0(%rsp)
  and    $0x1,%eax
  movl   $0x0,0x24(%rsp)
  mov    %eax,0xc4(%rsp)
L15:
  mov    0xa0(%rsp),%eax
  test   %eax,%eax
  je     L196
  movslq %eax,%r13
  mov    %eax,0xa4(%rsp)
  mov    %r15d,%eax
  mov    %rbx,%r15
  mov    %r13,0x48(%rsp)
  mov    %eax,%ebx
L151:
  mov    0x48(%rsp),%eax
  mov    %r15,0x68(%rsp)
  mov    %ebx,%r14d
  subl   $0x1,0xa4(%rsp)
  and    $0x1,%eax
  movl   $0x0,0x28(%rsp)
  mov    %eax,0xc8(%rsp)
L42:
  mov    0xa4(%rsp),%eax
  test   %eax,%eax
  je     L30
  mov    %eax,0xa8(%rsp)
  movslq %eax,%r12
  mov    %r12,0x50(%rsp)
  mov    %r14d,%r12d
  mov    %r15,%r14
L379:
  mov    0x50(%rsp),%eax
  subl   $0x1,0xa8(%rsp)
  mov    %r14,0x88(%rsp)
  and    $0x1,%eax
  movl   $0x0,0x2c(%rsp)
  mov    %eax,0xcc(%rsp)
L36:
  mov    0xa8(%rsp),%eax
  test   %eax,%eax
  je     L385
  mov    %eax,0xac(%rsp)
  movslq %eax,%rbx
L337:
  mov    %ebx,%eax
  subl   $0x1,0xac(%rsp)
  mov    %r12d,%r15d
  and    $0x1,%eax
  mov    %r14,0x90(%rsp)
  mov    %eax,0xd0(%rsp)
  movl   $0x0,0x38(%rsp)
L62:
  mov    0xac(%rsp),%eax
  test   %eax,%eax
  je     L184
  mov    %eax,0x74(%rsp)
  movslq %eax,%r13
  mov    %rbx,0xe0(%rsp)
  mov    %r13,%rbx
  mov    %r15d,%r13d
L252:
  mov    %ebx,%eax
  subl   $0x1,0x74(%rsp)
  xor    %ebp,%ebp
  mov    %r14,%r12
  and    $0x1,%eax
  mov    %ebp,0x70(%rsp)
  mov    %r13d,%ebp
  mov    %rbx,%r13
  mov    %eax,0xd4(%rsp)
L91:
  mov    0x74(%rsp),%r11d
  test   %r11d,%r11d
  je     L68
  movslq 0x74(%rsp),%r15
  mov    %r12,0xe8(%rsp)
  mov    %ebp,%r12d
L147:
  lea    -0x1(%r15),%ebp
  test   $0x1,%r15b
  jne    L335
  xor    %ebx,%ebx
L103:
  mov    %r12d,%edx
  mov    %ebp,%esi
  mov    %r14,%rdi
  add    $0x1,%ebx
  call   <print_permutations>
  mov    (%r14,%r15,8),%rax
  mov    (%r14),%rdx
  mov    %rdx,(%r14,%r15,8)
  mov    %rax,(%r14)
  cmp    %r15d,%ebx
  jl     L103
L123:
  sub    $0x1,%r15
  test   %r15d,%r15d
  jne    L147
  mov    %r12d,%ebp
  mov    %r14,%rdi
  mov    0xe8(%rsp),%r12
  mov    %ebp,%esi
  call   <print_string_array@plt>
  mov    0xd4(%rsp),%r10d
  mov    %r12,%rax
  mov    (%r14,%r13,8),%rcx
  test   %r10d,%r10d
  cmove  %r14,%rax
  addl   $0x1,0x70(%rsp)
  add    $0x8,%r12
  mov    (%rax),%rsi
  mov    %rsi,(%r14,%r13,8)
  mov    %rcx,(%rax)
  mov    0x70(%rsp),%eax
  cmp    %r13d,%eax
  jl     L91
  mov    %r13,%rbx
  mov    %ebp,%r13d
  sub    $0x1,%rbx
  jmp    L252
L141:
  mov    %ebp,%r12d
  mov    0x80(%rsp),%r13
  mov    %rbx,%rbp
  mov    0x8(%rsp),%rbx
L400:
  mov    %r12d,%esi
  mov    %rbp,%rdi
  add    $0x8,%r13
  call   <print_string_array@plt>
  mov    -0x8(%r13),%rdx
  mov    0x0(%rbp,%rbx,8),%rax
  mov    %rdx,0x0(%rbp,%rbx,8)
  mov    %rax,-0x8(%r13)
  cmp    0xb0(%rsp),%r13
  jne    L400
L189:
  add    $0xf8,%rsp
  mov    %r12d,%esi
  mov    %rbp,%rdi
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1050 <print_string_array@plt>
  nopw   0x0(%rax,%rax,1)
L335:
  xor    %ebx,%ebx
L273:
  mov    %r12d,%edx
  mov    %ebp,%esi
  mov    %r14,%rdi
  call   <print_permutations>
  mov    (%r14,%rbx,8),%rdx
  mov    (%r14,%r15,8),%rax
  mov    %rdx,(%r14,%r15,8)
  mov    %rax,(%r14,%rbx,8)
  add    $0x1,%rbx
  cmp    %r15d,%ebx
  jge    L123
  jmp    L273
  cs nopw 0x0(%rax,%rax,1)
L68:
  mov    %ebp,%r15d
  mov    0xe0(%rsp),%rbx
  mov    0x70(%rsp),%ebp
L325:
  mov    %r15d,%esi
  mov    %r14,%rdi
  add    $0x1,%ebp
  add    $0x8,%r12
  call   <print_string_array@plt>
  mov    -0x8(%r12),%rdx
  mov    (%r14,%r13,8),%rax
  mov    %rdx,(%r14,%r13,8)
  mov    %rax,-0x8(%r12)
  cmp    %r13d,%ebp
  jl     L325
  mov    %r15d,%esi
  mov    %r14,%rdi
  call   <print_string_array@plt>
  mov    0xd0(%rsp),%eax
  mov    (%r14,%rbx,8),%rcx
  mov    0x90(%rsp),%rdi
  test   %eax,%eax
  mov    %rdi,%rax
  cmove  %r14,%rax
  addl   $0x1,0x38(%rsp)
  add    $0x8,%rdi
  mov    %rdi,0x90(%rsp)
  mov    (%rax),%rsi
  mov    %rsi,(%r14,%rbx,8)
  mov    %rcx,(%rax)
  mov    0x38(%rsp),%eax
  cmp    %ebx,%eax
  jl     L62
  mov    %r15d,%r12d
  sub    $0x1,%rbx
  jmp    L337
L184:
  mov    0x90(%rsp),%r13
  mov    0x38(%rsp),%ebp
  mov    %r15d,%r12d
L361:
  mov    %r12d,%esi
  mov    %r14,%rdi
  add    $0x1,%ebp
  add    $0x8,%r13
  call   <print_string_array@plt>
  mov    -0x8(%r13),%rdx
  mov    (%r14,%rbx,8),%rax
  mov    %rdx,(%r14,%rbx,8)
  mov    %rax,-0x8(%r13)
  cmp    %ebx,%ebp
  jl     L361
  mov    %r12d,%esi
  mov    %r14,%rdi
  call   <print_string_array@plt>
  mov    0x88(%rsp),%rdi
  mov    0x50(%rsp),%rcx
  mov    0xcc(%rsp),%edx
  mov    %rdi,%rax
  test   %edx,%edx
  mov    (%r14,%rcx,8),%rdx
  cmove  %r14,%rax
  addl   $0x1,0x2c(%rsp)
  add    $0x8,%rdi
  mov    %rdi,0x88(%rsp)
  mov    (%rax),%rsi
  mov    %rsi,(%r14,%rcx,8)
  mov    %rdx,(%rax)
  mov    0x2c(%rsp),%eax
  cmp    %ecx,%eax
  jl     L36
  subq   $0x1,0x50(%rsp)
  jmp    L379
L385:
  mov    %r14,%r15
  mov    0x88(%rsp),%r13
  mov    %r12d,%r14d
  mov    0x2c(%rsp),%ebx
  mov    0x50(%rsp),%r12
L163:
  mov    %r14d,%esi
  mov    %r15,%rdi
  add    $0x1,%ebx
  add    $0x8,%r13
  call   <print_string_array@plt>
  mov    -0x8(%r13),%rdx
  mov    (%r15,%r12,8),%rax
  mov    %rdx,(%r15,%r12,8)
  mov    %rax,-0x8(%r13)
  cmp    %r12d,%ebx
  jl     L163
  mov    %r14d,%esi
  mov    %r15,%rdi
  call   <print_string_array@plt>
  mov    0xc8(%rsp),%ecx
  mov    0x48(%rsp),%rdi
  test   %ecx,%ecx
  mov    0x68(%rsp),%rcx
  mov    (%r15,%rdi,8),%rdx
  mov    %rcx,%rax
  cmove  %r15,%rax
  addl   $0x1,0x28(%rsp)
  add    $0x8,%rcx
  mov    %rcx,0x68(%rsp)
  mov    (%rax),%rsi
  mov    %rsi,(%r15,%rdi,8)
  mov    %rdx,(%rax)
  mov    0x28(%rsp),%eax
  cmp    %edi,%eax
  jl     L42
  subq   $0x1,0x48(%rsp)
  mov    %r14d,%ebx
  jmp    L151
L30:
  mov    0x28(%rsp),%r12d
  mov    0x68(%rsp),%rbp
  mov    %r15,%rbx
  mov    %r14d,%r15d
  mov    0x48(%rsp),%r13
L244:
  mov    %r15d,%esi
  mov    %rbx,%rdi
  add    $0x1,%r12d
  add    $0x8,%rbp
  call   <print_string_array@plt>
  mov    -0x8(%rbp),%rdx
  mov    (%rbx,%r13,8),%rax
  mov    %rdx,(%rbx,%r13,8)
  mov    %rax,-0x8(%rbp)
  cmp    %r13d,%r12d
  jl     L244
  mov    %r15d,%esi
  mov    %rbx,%rdi
  call   <print_string_array@plt>
  mov    0x78(%rsp),%rdi
  mov    0x40(%rsp),%rcx
  mov    0xc4(%rsp),%esi
  mov    %rdi,%rax
  mov    (%rbx,%rcx,8),%rdx
  test   %esi,%esi
  cmove  %rbx,%rax
  addl   $0x1,0x24(%rsp)
  add    $0x8,%rdi
  mov    %rdi,0x78(%rsp)
  mov    (%rax),%rsi
  mov    %rsi,(%rbx,%rcx,8)
  mov    %rdx,(%rax)
  mov    0x24(%rsp),%eax
  cmp    %ecx,%eax
  jl     L15
  subq   $0x1,0x40(%rsp)
  mov    %r15d,%r14d
  jmp    L210
L196:
  mov    %r15d,%r14d
  mov    0x24(%rsp),%r12d
  mov    0x78(%rsp),%rbp
  mov    0x40(%rsp),%r15
L348:
  mov    %r14d,%esi
  mov    %rbx,%rdi
  add    $0x1,%r12d
  add    $0x8,%rbp
  call   <print_string_array@plt>
  mov    -0x8(%rbp),%rdx
  mov    (%rbx,%r15,8),%rax
  mov    %rdx,(%rbx,%r15,8)
  mov    %rax,-0x8(%rbp)
  cmp    %r15d,%r12d
  jl     L348
  mov    %r14d,%esi
  mov    %rbx,%rdi
  call   <print_string_array@plt>
  mov    0x58(%rsp),%rcx
  mov    0xc0(%rsp),%edi
  mov    %rcx,%rax
  test   %edi,%edi
  mov    0x18(%rsp),%rdi
  cmove  %rbx,%rax
  addl   $0x1,0x20(%rsp)
  add    $0x8,%rcx
  mov    (%rbx,%rdi,8),%rdx
  mov    %rcx,0x58(%rsp)
  mov    (%rax),%rsi
  mov    %rsi,(%rbx,%rdi,8)
  mov    %rdx,(%rax)
  mov    0x20(%rsp),%eax
  cmp    %edi,%eax
  jl     L133
  subq   $0x1,0x18(%rsp)
  mov    %r14d,%r15d
  jmp    L326
L274:
  mov    0x18(%rsp),%r12
  mov    0x20(%rsp),%r13d
  mov    %r14d,%r15d
  mov    0x58(%rsp),%rbp
L339:
  mov    %r15d,%esi
  mov    %rbx,%rdi
  add    $0x1,%r13d
  add    $0x8,%rbp
  call   <print_string_array@plt>
  mov    -0x8(%rbp),%rdx
  mov    (%rbx,%r12,8),%rax
  mov    %rdx,(%rbx,%r12,8)
  mov    %rax,-0x8(%rbp)
  cmp    %r12d,%r13d
  jl     L339
  mov    %r15d,%esi
  mov    %rbx,%rdi
  call   <print_string_array@plt>
  mov    0x60(%rsp),%rcx
  mov    0x30(%rsp),%rdi
  mov    0xbc(%rsp),%r8d
  mov    %rcx,%rax
  mov    (%rbx,%rdi,8),%rdx
  test   %r8d,%r8d
  cmove  %rbx,%rax
  addl   $0x1,0x14(%rsp)
  add    $0x8,%rcx
  mov    %rcx,0x60(%rsp)
  mov    (%rax),%rsi
  mov    %rsi,(%rbx,%rdi,8)
  mov    %rdx,(%rax)
  mov    0x14(%rsp),%eax
  cmp    %edi,%eax
  jl     L314
  subq   $0x1,0x30(%rsp)
  mov    %r15d,%ebp
  jmp    L235
L281:
  mov    0x14(%rsp),%r13d
  mov    0x60(%rsp),%r12
  mov    %r15d,%ebp
  mov    0x30(%rsp),%r14
L47:
  mov    %ebp,%esi
  mov    %rbx,%rdi
  add    $0x1,%r13d
  add    $0x8,%r12
  call   <print_string_array@plt>
  mov    -0x8(%r12),%rdx
  mov    (%rbx,%r14,8),%rax
  mov    %rdx,(%rbx,%r14,8)
  mov    %rax,-0x8(%r12)
  cmp    %r14d,%r13d
  jl     L47
  mov    %ebp,%esi
  mov    %rbx,%rdi
  call   <print_string_array@plt>
  mov    0x80(%rsp),%rcx
  mov    0x8(%rsp),%rdi
  mov    0xb8(%rsp),%r9d
  mov    %rcx,%rax
  mov    (%rbx,%rdi,8),%rdx
  test   %r9d,%r9d
  cmove  %rbx,%rax
  add    $0x8,%rcx
  mov    %rcx,0x80(%rsp)
  mov    (%rax),%rsi
  mov    %rsi,(%rbx,%rdi,8)
  mov    %rdx,(%rax)
  cmp    0xb0(%rsp),%rcx
  jne    L37
  subq   $0x1,0x8(%rsp)
  mov    0x8(%rsp),%r13d
  subl   $0x1,0x3c(%rsp)
  test   %r13d,%r13d
  jg     L234
L345:
  mov    0x3c(%rsp),%r12d
  subq   $0x1,0x8(%rsp)
  test   %r12d,%r12d
  jne    L89
  mov    %ebp,%r12d
  mov    %rbx,%rbp
  jmp    L189
```

assistant: ```c
void print_permutations(char *a[], int n, int size) {
  if (n == 0) {
    print_string_array(a, size);
  } else {
    for (int i = 0; i < n; i++) {
      print_permutations(a, n - 1, size);
      int j = n % 2 == 0 ? 0 : i;
      char *old_last = a[n];
      a[n] = a[j];
      a[j] = old_last;
    }
    print_permutations(a, n - 1, size);
  }
}
```