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

```asm
<main>:
  endbr64
  push   %r15
  xor    %edi,%edi
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x368,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x358(%rsp)
  xor    %eax,%eax
  movb   $0x73,0x47(%rsp)
  call   <time@plt>
  mov    %eax,%edi
  call   <srand@plt>
  lea    D21(%rip),%rdi
  call   <puts@plt>
  lea    D6(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  xor    %eax,%eax
  call   <getchar@plt>
  lea    D91(%rip),%rdi
  call   <system@plt>
  movzbl 0x47(%rsp),%eax
  and    $0xffffffdf,%eax
  cmp    $0x53,%al
  jne    L166
  lea    0x110(%rsp),%rax
  lea    D61(%rip),%r15
  mov    %rax,0x8(%rsp)
  lea    0x50(%rsp),%rax
  mov    %rax,0x30(%rsp)
  lea    0x290(%rsp),%rax
  mov    %rax,0x28(%rsp)
  lea    0x1d0(%rsp),%rax
  mov    %rax,(%rsp)
  lea    0x47(%rsp),%rax
  mov    %rax,0x38(%rsp)
  lea    0x70(%rsp),%rax
  mov    %rax,0x18(%rsp)
L88:
  mov    0x8(%rsp),%r14
  mov    0x30(%rsp),%rbx
  movl   $0x0,0x48(%rsp)
  movl   $0x0,0x4c(%rsp)
  mov    %r14,%rsi
  mov    %rbx,%rdi
  call   <ZerarMatriz@plt>
  mov    0x28(%rsp),%rsi
  mov    (%rsp),%rdi
  call   <ZerarMatriz@plt>
  mov    %rbx,%rdi
  call   <GerarBarco@plt>
  mov    %r14,%rdi
  call   <GerarBarco@plt>
L109:
  mov    0x48(%rsp),%eax
  mov    0x28(%rsp),%r13
  nop
L155:
  cmpl   $0xa,0x4c(%rsp)
  je     L148
  cmp    $0xa,%eax
  je     L148
  lea    D91(%rip),%rdi
  lea    0x130(%rsp),%rbp
  call   <system@plt>
  mov    0x18(%rsp),%rbx
  mov    %rbx,0x20(%rsp)
  nopw   0x0(%rax,%rax,1)
L99:
  lea    -0x20(%rbx),%r12
  nopl   0x0(%rax)
L86:
  mov    (%r12),%esi
  mov    %r15,%rdi
  xor    %eax,%eax
  add    $0x4,%r12
  call   <printf@plt>
  cmp    %rbx,%r12
  jne    L86
  mov    $0xa,%edi
  lea    0x20(%r12),%rbx
  call   <putchar@plt>
  cmp    %rbp,%rbx
  jne    L99
  mov    $0xa,%edi
  lea    0x1f0(%rsp),%r12
  mov    %rbp,%rbx
  call   <putchar@plt>
  mov    %rbp,0x10(%rsp)
  nopl   (%rax)
L53:
  lea    -0x20(%rbx),%r14
  nopl   0x0(%rax)
L0:
  mov    (%r14),%esi
  mov    %r15,%rdi
  xor    %eax,%eax
  add    $0x4,%r14
  call   <printf@plt>
  cmp    %rbx,%r14
  jne    L0
  mov    $0xa,%edi
  lea    0x20(%r14),%rbx
  call   <putchar@plt>
  cmp    %r12,%rbx
  jne    L53
  mov    0x4c(%rsp),%ecx
  mov    0x48(%rsp),%edx
  mov    %r13,%rsi
  mov    (%rsp),%rdi
  call   <Tela@plt>
  lea    D16(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    0x8(%rsp),%rdi
  lea    0x48(%rsp),%rdx
  mov    %r13,%rsi
  call   <Tiro@plt>
  lea    D91(%rip),%rdi
  call   <system@plt>
  mov    0x48(%rsp),%eax
  cmp    $0xa,%eax
  je     L155
  mov    0x20(%rsp),%r14
L9:
  lea    -0x20(%r14),%rbx
  nop
L118:
  mov    (%rbx),%esi
  mov    %r15,%rdi
  xor    %eax,%eax
  add    $0x4,%rbx
  call   <printf@plt>
  cmp    %r14,%rbx
  jne    L118
  mov    $0xa,%edi
  lea    0x20(%rbx),%r14
  call   <putchar@plt>
  cmp    %rbp,%r14
  jne    L9
  mov    $0xa,%edi
  call   <putchar@plt>
  mov    0x10(%rsp),%rbp
L77:
  lea    -0x20(%rbp),%rbx
  nopl   0x0(%rax,%rax,1)
L133:
  mov    (%rbx),%esi
  mov    %r15,%rdi
  xor    %eax,%eax
  add    $0x4,%rbx
  call   <printf@plt>
  cmp    %rbp,%rbx
  jne    L133
  mov    $0xa,%edi
  lea    0x20(%rbx),%rbp
  call   <putchar@plt>
  cmp    %r12,%rbp
  jne    L77
  mov    (%rsp),%rbx
  mov    0x48(%rsp),%edx
  mov    0x28(%rsp),%rsi
  mov    0x4c(%rsp),%ecx
  mov    %rbx,%rdi
  call   <Tela@plt>
  lea    D65(%rip),%rdi
  call   <puts@plt>
  mov    0x30(%rsp),%rdi
  lea    0x4c(%rsp),%rdx
  mov    %rbx,%rsi
  call   <Tiro@plt>
  jmp    L109
L148:
  lea    D43(%rip),%rdi
  call   <system@plt>
  cmpl   $0xa,0x48(%rsp)
  je     L69
  lea    D93(%rip),%rdi
  call   <puts@plt>
L95:
  lea    D104(%rip),%rdi
  call   <puts@plt>
  mov    0x38(%rsp),%rsi
  lea    D42(%rip),%rdi
  call   <scanf@plt>
  movzbl 0x47(%rsp),%eax
  and    $0xffffffdf,%eax
  cmp    $0x53,%al
  je     L88
L166:
  mov    0x358(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L145
  add    $0x368,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L69:
  lea    D126(%rip),%rdi
  call   <puts@plt>
  jmp    L95
L145:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: label: D21
data_type: string
name: retrieve_data
arguments: label: D6
data_type: string
name: retrieve_data
arguments: label: D91
data_type: string
name: retrieve_data
arguments: label: D61
data_type: string
name: retrieve_data
arguments: label: D16
data_type: string
name: retrieve_data
arguments: label: D65
data_type: string
name: retrieve_data
arguments: label: D43
data_type: string
name: retrieve_data
arguments: label: D93
data_type: string
name: retrieve_data
arguments: label: D104
data_type: string
name: retrieve_data
arguments: label: D42
data_type: string
name: retrieve_data
arguments: label: D126
data_type: string

tool: D21:  ____        _        _ _             _   _                  _
| __ )  __ _| |_ __ _| | |__   __ _  | \ | | __ ___   ____ _| |
| \_ \ / _` | __/ _` | | '_ \ / _` | |  \| |/ _` \ \ / / _` | |
| |_) | (_| | |_ (_| | | | | | (_| | | |\  | (_| |\ V / (_| | |
|____/ \__,_|\__\__,_|_|_| |_|\__,_| |_| \_|\__,_| \_/ \__,_|_|

tool: D6: 		Aperte enter para jogar...

tool: D91: clear||cls

tool: D61: %d 

tool: D16: 		 Jogador 1

tool: D65: 		 Jogador 2

tool: D43: clear || cls

tool: D93: 

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!PLAYER 2 GANHOU !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


tool: D104: 
	Quer jogar de novo?(S/N)

tool: D42: %c

tool: D126: 

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!PLAYER 1 GANHOU !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


assistant: ```c
int main() {
  int P1[6][8], P2[6][8], P1Tela[6][8], P2Tela[6][8];
  int P1Ponto, P2Ponto;
  int i, j;
  char Jogar = 's';
  srand(time(NULL));
  printf(" ____        _        _ _             _   _                  _\n| __ )  __ _| |_ __ _| | |__   __ _  | \\ | | __ ___   ____ _| |\n| \\_ \\ / _` | __/ _` | | '_ \\ / _` | |  \\| |/ _` \\ \\ / / _` | |\n| |_) | (_| | |_ (_| | | | | | (_| | | |\\  | (_| |\\ V / (_| | |\n|____/ \\__,_|\\__\\__,_|_|_| |_|\\__,_| |_| \\_|\\__,_| \\_/ \\__,_|_|\n");
  printf("\t\tAperte enter para jogar...");
  getchar();
  system("clear||cls");
  while ((Jogar == 's') || (Jogar == 'S')) {
    P1Ponto = 0;
    P2Ponto = 0;
    ZerarMatriz(P1, P2);
    ZerarMatriz(P1Tela, P2Tela);
    GerarBarco(P1);
    GerarBarco(P2);
    while ((P1Ponto != 10) && (P2Ponto != 10)) {
      system("clear||cls");
      for (i = 0; i < 6; i++) {
        for (j = 0; j < 8; j++) {
          printf("%d ", P1[i][j]);
        }
        printf("\n");
      }
      printf("\n");
      for (i = 0; i < 6; i++) {
        for (j = 0; j < 8; j++) {
          printf("%d ", P2[i][j]);
        }
        printf("\n");
      }
      Tela(P1Tela, P2Tela, P1Ponto, P2Ponto);
      printf("\t\t Jogador 1");
      Tiro(P2, P2Tela, &P1Ponto);
      system("clear||cls");
      if (P1Ponto != 10) {
        for (i = 0; i < 6; i++) {
          for (j = 0; j < 8; j++) {
            printf("%d ", P1[i][j]);
          }
          printf("\n");
        }
        printf("\n");
        for (i = 0; i < 6; i++) {
          for (j = 0; j < 8; j++) {
            printf("%d ", P2[i][j]);
          }
          printf("\n");
        }
        Tela(P1Tela, P2Tela, P1Ponto, P2Ponto);
        printf("\t\t Jogador 2\n");
        Tiro(P1, P1Tela, &P2Ponto);
      }
    }
    system("clear || cls");
    if (P1Ponto == 10) {
      printf("\n\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!PLAYER 1 GANHOU !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n");
    } else {
      printf("\n\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!PLAYER 2 GANHOU !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n");
    }
    printf("\n\tQuer jogar de novo?(S/N)\n");
    scanf("%c", &Jogar);
  }
  return 0;
}
```