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

```asm
<copiatabuleiro>:
  endbr64
  push   %r12
  push   %rbp
  mov    %rdi,%rbp
  mov    $0x48,%edi
  push   %rbx
  call   <malloc@plt>
  mov    $0x288,%edi
  mov    %rax,%r12
  call   <malloc@plt>
  mov    $0x2d9,%edi
  mov    %rax,(%r12)
  mov    %rax,%rbx
  call   <malloc@plt>
  mov    %rax,(%rbx)
  test   %rbp,%rbp
  je     L0
  mov    0x0(%rbp),%rcx
  mov    (%r12),%rax
  mov    $0x2d9,%edx
  mov    (%rcx),%rsi
  mov    (%rax),%rdi
  call   <memcpy@plt>
L8:
  mov    (%r12),%rax
  mov    (%rax),%rdx
  lea    0x9(%rdx),%rcx
  mov    %rcx,0x8(%rax)
  lea    0x12(%rdx),%rcx
  mov    %rcx,0x10(%rax)
  lea    0x1b(%rdx),%rcx
  mov    %rcx,0x18(%rax)
  lea    0x24(%rdx),%rcx
  mov    %rcx,0x20(%rax)
  lea    0x2d(%rdx),%rcx
  mov    %rcx,0x28(%rax)
  lea    0x36(%rdx),%rcx
  mov    %rcx,0x30(%rax)
  lea    0x3f(%rdx),%rcx
  mov    %rcx,0x38(%rax)
  lea    0x48(%rdx),%rcx
  mov    %rcx,0x40(%rax)
  lea    0x48(%rax),%rcx
  mov    %rcx,0x8(%r12)
  lea    0x51(%rdx),%rcx
  mov    %rcx,0x48(%rax)
  lea    0x5a(%rdx),%rcx
  mov    %rcx,0x50(%rax)
  lea    0x63(%rdx),%rcx
  mov    %rcx,0x58(%rax)
  lea    0x6c(%rdx),%rcx
  mov    %rcx,0x60(%rax)
  lea    0x75(%rdx),%rcx
  mov    %rcx,0x68(%rax)
  lea    0x7e(%rdx),%rcx
  mov    %rcx,0x70(%rax)
  lea    0x87(%rdx),%rcx
  mov    %rcx,0x78(%rax)
  lea    0x90(%rdx),%rcx
  mov    %rcx,0x80(%rax)
  lea    0x99(%rdx),%rcx
  mov    %rcx,0x88(%rax)
  lea    0x90(%rax),%rcx
  mov    %rcx,0x10(%r12)
  lea    0xa2(%rdx),%rcx
  mov    %rcx,0x90(%rax)
  lea    0xab(%rdx),%rcx
  mov    %rcx,0x98(%rax)
  lea    0xb4(%rdx),%rcx
  mov    %rcx,0xa0(%rax)
  lea    0xbd(%rdx),%rcx
  mov    %rcx,0xa8(%rax)
  lea    0xc6(%rdx),%rcx
  mov    %rcx,0xb0(%rax)
  lea    0xcf(%rdx),%rcx
  mov    %rcx,0xb8(%rax)
  lea    0xd8(%rdx),%rcx
  mov    %rcx,0xc0(%rax)
  lea    0xe1(%rdx),%rcx
  mov    %rcx,0xc8(%rax)
  lea    0xea(%rdx),%rcx
  mov    %rcx,0xd0(%rax)
  lea    0xd8(%rax),%rcx
  mov    %rcx,0x18(%r12)
  lea    0xf3(%rdx),%rcx
  mov    %rcx,0xd8(%rax)
  lea    0xfc(%rdx),%rcx
  mov    %rcx,0xe0(%rax)
  lea    0x105(%rdx),%rcx
  mov    %rcx,0xe8(%rax)
  lea    0x10e(%rdx),%rcx
  mov    %rcx,0xf0(%rax)
  lea    0x117(%rdx),%rcx
  mov    %rcx,0xf8(%rax)
  lea    0x120(%rdx),%rcx
  mov    %rcx,0x100(%rax)
  lea    0x129(%rdx),%rcx
  mov    %rcx,0x108(%rax)
  lea    0x132(%rdx),%rcx
  mov    %rcx,0x110(%rax)
  lea    0x13b(%rdx),%rcx
  mov    %rcx,0x118(%rax)
  lea    0x120(%rax),%rcx
  mov    %rcx,0x20(%r12)
  lea    0x144(%rdx),%rcx
  mov    %rcx,0x120(%rax)
  lea    0x14d(%rdx),%rcx
  mov    %rcx,0x128(%rax)
  lea    0x156(%rdx),%rcx
  mov    %rcx,0x130(%rax)
  lea    0x15f(%rdx),%rcx
  mov    %rcx,0x138(%rax)
  lea    0x168(%rdx),%rcx
  mov    %rcx,0x140(%rax)
  lea    0x171(%rdx),%rcx
  mov    %rcx,0x148(%rax)
  lea    0x17a(%rdx),%rcx
  mov    %rcx,0x150(%rax)
  lea    0x183(%rdx),%rcx
  mov    %rcx,0x158(%rax)
  lea    0x18c(%rdx),%rcx
  mov    %rcx,0x160(%rax)
  lea    0x168(%rax),%rcx
  mov    %rcx,0x28(%r12)
  lea    0x195(%rdx),%rcx
  mov    %rcx,0x168(%rax)
  lea    0x19e(%rdx),%rcx
  mov    %rcx,0x170(%rax)
  lea    0x1a7(%rdx),%rcx
  mov    %rcx,0x178(%rax)
  lea    0x1b0(%rdx),%rcx
  mov    %rcx,0x180(%rax)
  lea    0x1b9(%rdx),%rcx
  mov    %rcx,0x188(%rax)
  lea    0x1c2(%rdx),%rcx
  mov    %rcx,0x190(%rax)
  lea    0x1cb(%rdx),%rcx
  mov    %rcx,0x198(%rax)
  lea    0x1d4(%rdx),%rcx
  mov    %rcx,0x1a0(%rax)
  lea    0x1dd(%rdx),%rcx
  mov    %rcx,0x1a8(%rax)
  lea    0x1b0(%rax),%rcx
  mov    %rcx,0x30(%r12)
  lea    0x1e6(%rdx),%rcx
  mov    %rcx,0x1b0(%rax)
  lea    0x1ef(%rdx),%rcx
  mov    %rcx,0x1b8(%rax)
  lea    0x1f8(%rdx),%rcx
  mov    %rcx,0x1c0(%rax)
  lea    0x201(%rdx),%rcx
  mov    %rcx,0x1c8(%rax)
  lea    0x20a(%rdx),%rcx
  mov    %rcx,0x1d0(%rax)
  lea    0x213(%rdx),%rcx
  mov    %rcx,0x1d8(%rax)
  lea    0x21c(%rdx),%rcx
  mov    %rcx,0x1e0(%rax)
  lea    0x225(%rdx),%rcx
  mov    %rcx,0x1e8(%rax)
  lea    0x22e(%rdx),%rcx
  mov    %rcx,0x1f0(%rax)
  lea    0x1f8(%rax),%rcx
  mov    %rcx,0x38(%r12)
  lea    0x237(%rdx),%rcx
  mov    %rcx,0x1f8(%rax)
  lea    0x240(%rdx),%rcx
  mov    %rcx,0x200(%rax)
  lea    0x249(%rdx),%rcx
  mov    %rcx,0x208(%rax)
  lea    0x252(%rdx),%rcx
  mov    %rcx,0x210(%rax)
  lea    0x25b(%rdx),%rcx
  mov    %rcx,0x218(%rax)
  lea    0x264(%rdx),%rcx
  mov    %rcx,0x220(%rax)
  lea    0x26d(%rdx),%rcx
  mov    %rcx,0x228(%rax)
  lea    0x276(%rdx),%rcx
  mov    %rcx,0x230(%rax)
  lea    0x27f(%rdx),%rcx
  mov    %rcx,0x238(%rax)
  lea    0x240(%rax),%rcx
  mov    %rcx,0x40(%r12)
  lea    0x288(%rdx),%rcx
  mov    %rcx,0x240(%rax)
  lea    0x291(%rdx),%rcx
  mov    %rcx,0x248(%rax)
  lea    0x29a(%rdx),%rcx
  mov    %rcx,0x250(%rax)
  lea    0x2a3(%rdx),%rcx
  mov    %rcx,0x258(%rax)
  lea    0x2ac(%rdx),%rcx
  mov    %rcx,0x260(%rax)
  lea    0x2b5(%rdx),%rcx
  mov    %rcx,0x268(%rax)
  lea    0x2be(%rdx),%rcx
  mov    %rcx,0x270(%rax)
  lea    0x2c7(%rdx),%rcx
  add    $0x2d0,%rdx
  mov    %rcx,0x278(%rax)
  mov    %rdx,0x280(%rax)
  mov    %r12,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L0:
  mov    (%r12),%rax
  mov    $0x2d9,%edx
  mov    $0x1,%esi
  mov    (%rax),%rdi
  call   <memset@plt>
  jmp    L8
```

assistant: ```c
char ***copiatabuleiro(char ***old) {
  int i, j;
  char ***tabuleiro = malloc(9 * sizeof(char **));
  tabuleiro[0] = malloc(9 * 9 * sizeof(char *));
  tabuleiro[0][0] = malloc(9 * 9 * 9 * sizeof(char));
  if (old)
    memcpy(tabuleiro[0][0], **old, 9 * 9 * 9 * sizeof(char));
  else
    memset(tabuleiro[0][0], 1, 9 * 9 * 9 * sizeof(char));
  for (i = 0; i < 9; i++) {
    if (i) {
      tabuleiro[i] = tabuleiro[i - 1] + 9;
      tabuleiro[i][0] = tabuleiro[i - 1][9 - 1] + 9;
    }
    for (j = 1; j < 9; j++)
      tabuleiro[i][j] = tabuleiro[i][j - 1] + 9;
  }
  return tabuleiro;
}
```