user: 请从给定的汇编指令推导出C源代码:

```asm
<print_parens_aux>:
  endbr64
  push   %r15
  mov    %rdi,%r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0xa8,%rsp
  mov    %rsi,0x88(%rsp)
  mov    %edx,0x90(%rsp)
  cmp    %edx,%ecx
  jne    L751
  test   %r8d,%r8d
  je     L243
L751:
  addq   $0x1,0x88(%rsp)
  lea    0x1(%r8),%eax
  mov    %eax,0x94(%rsp)
  mov    0x90(%rsp),%eax
  add    $0x1,%eax
  mov    %eax,0x9c(%rsp)
  mov    0x94(%rsp),%eax
  sub    $0x1,%eax
  mov    %eax,0x74(%rsp)
  jne    L716
L116:
  cmp    0x90(%rsp),%ecx
  jbe    L406
  mov    0x88(%rsp),%rax
  movb   $0x28,-0x1(%r15,%rax,1)
L630:
  addl   $0x1,0x94(%rsp)
  mov    0x94(%rsp),%eax
  addl   $0x1,0x9c(%rsp)
  addl   $0x1,0x90(%rsp)
  addq   $0x1,0x88(%rsp)
  sub    $0x1,%eax
  mov    %eax,0x74(%rsp)
  je     L116
L716:
  mov    0x88(%rsp),%rax
  cmpl   $0x2,0x94(%rsp)
  movb   $0x29,-0x1(%r15,%rax,1)
  jne    L48
  cmp    0x90(%rsp),%ecx
  je     L28
L48:
  mov    0x88(%rsp),%rax
  add    $0x1,%rax
  mov    %rax,0x78(%rsp)
  mov    0x90(%rsp),%eax
  mov    %eax,0x80(%rsp)
  mov    0x9c(%rsp),%eax
  mov    %eax,0x98(%rsp)
  mov    0x74(%rsp),%eax
  sub    $0x1,%eax
  mov    %eax,0x60(%rsp)
  jne    L741
L176:
  cmp    0x80(%rsp),%ecx
  jbe    L13
  mov    0x78(%rsp),%rax
  movb   $0x28,-0x1(%r15,%rax,1)
L230:
  addl   $0x1,0x74(%rsp)
  mov    0x74(%rsp),%eax
  addl   $0x1,0x98(%rsp)
  addl   $0x1,0x80(%rsp)
  addq   $0x1,0x78(%rsp)
  sub    $0x1,%eax
  mov    %eax,0x60(%rsp)
  je     L176
L741:
  mov    0x78(%rsp),%rax
  movb   $0x29,-0x1(%r15,%rax,1)
  cmp    0x80(%rsp),%ecx
  jne    L235
  cmpl   $0x2,0x74(%rsp)
  je     L20
L235:
  mov    0x78(%rsp),%rax
  add    $0x1,%rax
  mov    %rax,0x58(%rsp)
  mov    0x80(%rsp),%eax
  mov    %eax,0x64(%rsp)
  mov    0x98(%rsp),%eax
  mov    %eax,0x84(%rsp)
  mov    0x60(%rsp),%eax
  sub    $0x1,%eax
  mov    %eax,0x38(%rsp)
  jne    L491
L30:
  cmp    0x64(%rsp),%ecx
  jbe    L431
  mov    0x58(%rsp),%rax
  movb   $0x28,-0x1(%r15,%rax,1)
L339:
  addl   $0x1,0x60(%rsp)
  mov    0x60(%rsp),%eax
  addl   $0x1,0x84(%rsp)
  addl   $0x1,0x64(%rsp)
  addq   $0x1,0x58(%rsp)
  sub    $0x1,%eax
  mov    %eax,0x38(%rsp)
  je     L30
L491:
  mov    0x58(%rsp),%rax
  movb   $0x29,-0x1(%r15,%rax,1)
  cmp    0x64(%rsp),%ecx
  jne    L546
  cmpl   $0x2,0x60(%rsp)
  je     L109
L546:
  mov    0x58(%rsp),%rax
  add    $0x1,%rax
  mov    %rax,0x30(%rsp)
  mov    0x64(%rsp),%eax
  mov    %eax,0x3c(%rsp)
  mov    0x84(%rsp),%eax
  mov    %eax,0x70(%rsp)
  mov    0x38(%rsp),%eax
  sub    $0x1,%eax
  mov    %eax,0x1c(%rsp)
  jne    L557
L666:
  cmp    0x3c(%rsp),%ecx
  jbe    L775
  mov    0x30(%rsp),%rax
  movb   $0x28,-0x1(%r15,%rax,1)
L317:
  addl   $0x1,0x38(%rsp)
  mov    0x38(%rsp),%eax
  addl   $0x1,0x70(%rsp)
  addl   $0x1,0x3c(%rsp)
  addq   $0x1,0x30(%rsp)
  sub    $0x1,%eax
  mov    %eax,0x1c(%rsp)
  je     L666
L557:
  mov    0x30(%rsp),%rax
  cmpl   $0x2,0x38(%rsp)
  movb   $0x29,-0x1(%r15,%rax,1)
  jne    L631
  cmp    0x3c(%rsp),%ecx
  je     L56
L631:
  mov    0x30(%rsp),%rax
  add    $0x1,%rax
  mov    %rax,0x20(%rsp)
  mov    0x3c(%rsp),%eax
  mov    %eax,0x28(%rsp)
  mov    0x70(%rsp),%eax
  mov    %eax,0x54(%rsp)
  mov    0x1c(%rsp),%eax
  sub    $0x1,%eax
  mov    %eax,0x10(%rsp)
  jne    L382
L617:
  cmp    0x28(%rsp),%ecx
  jbe    L43
  mov    0x20(%rsp),%rax
  movb   $0x28,-0x1(%r15,%rax,1)
L248:
  addl   $0x1,0x1c(%rsp)
  mov    0x1c(%rsp),%eax
  addl   $0x1,0x54(%rsp)
  addl   $0x1,0x28(%rsp)
  addq   $0x1,0x20(%rsp)
  sub    $0x1,%eax
  mov    %eax,0x10(%rsp)
  je     L617
L382:
  mov    0x20(%rsp),%rax
  cmpl   $0x2,0x1c(%rsp)
  movb   $0x29,-0x1(%r15,%rax,1)
  jne    L2
  cmp    0x28(%rsp),%ecx
  je     L501
L2:
  mov    0x20(%rsp),%rax
  mov    %ecx,%ebx
  add    $0x1,%rax
  mov    %rax,0x8(%rsp)
  mov    0x28(%rsp),%eax
  mov    %eax,0x14(%rsp)
  mov    0x54(%rsp),%eax
  mov    %eax,0x2c(%rsp)
  mov    0x10(%rsp),%eax
  sub    $0x1,%eax
  mov    %eax,(%rsp)
  jne    L159
L676:
  cmp    0x14(%rsp),%ebx
  jbe    L114
  mov    0x8(%rsp),%rax
  movb   $0x28,-0x1(%r15,%rax,1)
L198:
  addl   $0x1,0x10(%rsp)
  mov    0x10(%rsp),%eax
  addl   $0x1,0x2c(%rsp)
  addl   $0x1,0x14(%rsp)
  addq   $0x1,0x8(%rsp)
  sub    $0x1,%eax
  mov    %eax,(%rsp)
  je     L676
L159:
  mov    0x8(%rsp),%rax
  movb   $0x29,-0x1(%r15,%rax,1)
  cmp    0x14(%rsp),%ebx
  jne    L58
  cmpl   $0x2,0x10(%rsp)
  je     L665
L58:
  mov    0x8(%rsp),%rax
  mov    (%rsp),%r13d
  lea    0x1(%rax),%r10
  mov    0x14(%rsp),%eax
  mov    %eax,0x4(%rsp)
  mov    0x2c(%rsp),%eax
  mov    %eax,0x18(%rsp)
  sub    $0x1,%r13d
  jne    L527
L718:
  cmp    0x4(%rsp),%ebx
  jbe    L759
  movb   $0x28,-0x1(%r15,%r10,1)
L466:
  addl   $0x1,(%rsp)
  mov    (%rsp),%r13d
  add    $0x1,%r10
  addl   $0x1,0x18(%rsp)
  addl   $0x1,0x4(%rsp)
  sub    $0x1,%r13d
  je     L718
L527:
  movb   $0x29,-0x1(%r15,%r10,1)
  cmp    0x4(%rsp),%ebx
  jne    L261
  cmpl   $0x2,(%rsp)
  je     L494
L261:
  mov    %r13d,%ebp
  mov    %r10,0x68(%rsp)
  mov    0x4(%rsp),%r9d
  lea    0x1(%r10),%r14
  mov    0x18(%rsp),%r11d
  sub    $0x1,%ebp
  jne    L793
L254:
  cmp    %r9d,%ebx
  jbe    L388
  movb   $0x28,-0x1(%r15,%r14,1)
L10:
  add    $0x1,%r13d
  add    $0x1,%r11d
  add    $0x1,%r9d
  add    $0x1,%r14
  mov    %r13d,%ebp
  sub    $0x1,%ebp
  je     L254
L793:
  movb   $0x29,-0x1(%r15,%r14,1)
  cmp    %r9d,%ebx
  jne    L474
  cmp    $0x2,%r13d
  je     L677
L474:
  mov    %r14,0x40(%rsp)
  lea    0x1(%r14),%r12
  mov    %r15,%r14
  mov    %ebx,%r15d
  mov    %r13d,0x50(%rsp)
  mov    %r9d,%ebx
  mov    %r11d,%r13d
  mov    %r9d,0x48(%rsp)
  mov    %r11d,0x4c(%rsp)
  cmp    $0x1,%ebp
  jne    L161
L699:
  cmp    %ebx,%r15d
  jbe    L360
  movb   $0x28,-0x1(%r14,%r12,1)
L287:
  add    $0x1,%ebp
  add    $0x1,%r13d
  add    $0x1,%ebx
  add    $0x1,%r12
  cmp    $0x1,%ebp
  je     L699
L161:
  movb   $0x29,-0x1(%r14,%r12,1)
  lea    -0x2(%rbp),%r8d
  mov    %r15d,%ecx
  mov    %ebx,%edx
  mov    %r12,%rsi
  mov    %r14,%rdi
  call   <print_parens_aux>
  cmp    %ebx,%r15d
  jbe    L360
  movb   $0x28,-0x1(%r14,%r12,1)
  cmp    %r13d,%r15d
  jne    L287
  test   %ebp,%ebp
  jne    L287
  mov    %r15d,%ebx
  mov    0x48(%rsp),%r9d
  mov    %r14,%r15
  mov    0x4c(%rsp),%r11d
  mov    0x50(%rsp),%r13d
  mov    0x40(%rsp),%r14
L47:
  movb   $0x0,(%r15,%r12,1)
  mov    %r15,%rsi
  lea    D41(%rip),%rdi
  mov    %r11d,0x48(%rsp)
  mov    %r9d,0x40(%rsp)
  call   <printf@plt>
  mov    0x40(%rsp),%r9d
  mov    0x48(%rsp),%r11d
  cmp    %r9d,%ebx
  jbe    L388
L700:
  movb   $0x28,-0x1(%r15,%r14,1)
  cmp    %r11d,%ebx
  jne    L10
  test   %r13d,%r13d
  jne    L10
  mov    0x68(%rsp),%r10
L605:
  movb   $0x0,(%r15,%r14,1)
  mov    %r15,%rsi
  lea    D41(%rip),%rdi
  mov    %r10,0x40(%rsp)
  call   <printf@plt>
  mov    0x40(%rsp),%r10
L725:
  cmp    0x4(%rsp),%ebx
  jbe    L759
  movb   $0x28,-0x1(%r15,%r10,1)
  cmp    0x18(%rsp),%ebx
  jne    L466
  mov    (%rsp),%r11d
  test   %r11d,%r11d
  jne    L466
L25:
  movb   $0x0,(%r15,%r10,1)
  mov    %r15,%rsi
  lea    D41(%rip),%rdi
  call   <printf@plt>
L759:
  cmp    0x14(%rsp),%ebx
  jbe    L114
  mov    0x8(%rsp),%rax
  movb   $0x28,-0x1(%r15,%rax,1)
  cmp    0x2c(%rsp),%ebx
  jne    L198
  mov    0x10(%rsp),%r9d
  test   %r9d,%r9d
  jne    L198
  mov    %ebx,%ecx
L451:
  movb   $0x0,(%r15,%rax,1)
  mov    %r15,%rsi
  lea    D41(%rip),%rdi
  mov    %ecx,(%rsp)
  call   <printf@plt>
  mov    (%rsp),%ecx
L563:
  cmp    0x28(%rsp),%ecx
  jbe    L43
  mov    0x20(%rsp),%rax
  movb   $0x28,-0x1(%r15,%rax,1)
  cmp    0x54(%rsp),%ecx
  jne    L248
  mov    0x1c(%rsp),%r8d
  test   %r8d,%r8d
  jne    L248
L267:
  mov    0x20(%rsp),%rax
  mov    %r15,%rsi
  lea    D41(%rip),%rdi
  mov    %ecx,(%rsp)
  movb   $0x0,(%r15,%rax,1)
  call   <printf@plt>
  mov    (%rsp),%ecx
L43:
  cmp    0x3c(%rsp),%ecx
  jbe    L775
  mov    0x30(%rsp),%rax
  movb   $0x28,-0x1(%r15,%rax,1)
  cmp    0x70(%rsp),%ecx
  jne    L317
  mov    0x38(%rsp),%edi
  test   %edi,%edi
  jne    L317
L280:
  mov    0x30(%rsp),%rax
  mov    %r15,%rsi
  lea    D41(%rip),%rdi
  mov    %ecx,(%rsp)
  movb   $0x0,(%r15,%rax,1)
  call   <printf@plt>
  mov    (%rsp),%ecx
L775:
  cmp    0x64(%rsp),%ecx
  jbe    L431
  mov    0x58(%rsp),%rax
  movb   $0x28,-0x1(%r15,%rax,1)
  cmp    0x84(%rsp),%ecx
  jne    L339
  mov    0x60(%rsp),%esi
  test   %esi,%esi
  jne    L339
L259:
  mov    0x58(%rsp),%rax
  mov    %r15,%rsi
  lea    D41(%rip),%rdi
  mov    %ecx,(%rsp)
  movb   $0x0,(%r15,%rax,1)
  call   <printf@plt>
  mov    (%rsp),%ecx
L431:
  cmp    0x80(%rsp),%ecx
  jbe    L13
  mov    0x78(%rsp),%rax
  movb   $0x28,-0x1(%r15,%rax,1)
  cmp    0x98(%rsp),%ecx
  jne    L230
  mov    0x74(%rsp),%edx
  test   %edx,%edx
  jne    L230
L645:
  mov    0x78(%rsp),%rax
  mov    %r15,%rsi
  lea    D41(%rip),%rdi
  mov    %ecx,(%rsp)
  movb   $0x0,(%r15,%rax,1)
  call   <printf@plt>
  mov    (%rsp),%ecx
L13:
  cmp    0x90(%rsp),%ecx
  jbe    L406
  mov    0x88(%rsp),%rax
  movb   $0x28,-0x1(%r15,%rax,1)
  cmp    0x9c(%rsp),%ecx
  jne    L630
  mov    0x94(%rsp),%eax
  test   %eax,%eax
  jne    L630
L243:
  mov    0x88(%rsp),%rax
  mov    %r15,%rsi
  lea    D41(%rip),%rdi
  movb   $0x0,(%r15,%rax,1)
  add    $0xa8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1050 <printf@plt>
L360:
  mov    0x48(%rsp),%r9d
  mov    %r15d,%ebx
  mov    0x4c(%rsp),%r11d
  mov    %r14,%r15
  mov    0x50(%rsp),%r13d
  mov    0x40(%rsp),%r14
  cmp    %r9d,%ebx
  ja     L700
  nopl   0x0(%rax,%rax,1)
L388:
  mov    0x68(%rsp),%r10
  jmp    L725
  nopw   0x0(%rax,%rax,1)
L114:
  mov    %ebx,%ecx
  jmp    L563
  nop
L677:
  mov    %r14,%r12
  jmp    L47
  nopl   0x0(%rax,%rax,1)
L494:
  mov    %r10,%r14
  jmp    L605
  nopl   0x0(%rax,%rax,1)
L665:
  mov    %rax,%r10
  jmp    L25
L501:
  mov    %rax,0x8(%rsp)
  jmp    L451
L406:
  add    $0xa8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L56:
  mov    %rax,0x20(%rsp)
  jmp    L267
L109:
  mov    %rax,0x30(%rsp)
  jmp    L280
L20:
  mov    %rax,0x58(%rsp)
  jmp    L259
L28:
  mov    %rax,0x78(%rsp)
  jmp    L645
```

tool_calls: name: read_data
arguments: tag: D41
type_guessed: string

tool: D41: %s


assistant: ```c
void print_parens_aux(char *buff, size_t buff_i, unsigned open_used, unsigned n, unsigned to_close) {
  if (open_used == n && to_close == 0) {
    buff[buff_i] = '\0';
    printf("%s\n", buff);
    return;
  }
  if (to_close > 0) {
    buff[buff_i] = ')';
    print_parens_aux(buff, buff_i + 1, open_used, n, to_close - 1);
  }
  if (open_used < n) {
    buff[buff_i] = '(';
    print_parens_aux(buff, buff_i + 1, open_used + 1, n, to_close + 1);
  }
}
```