user: Please show me the C implementation that matches the assembly code listed below:

```asm
<Multiplica>:
  endbr64
  push   %r12
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  mov    %rdx,%rbx
  sub    $0x7e0,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x7d8(%rsp)
  xor    %eax,%eax
  call   <atol@plt>
  mov    %rbp,%rdi
  mov    %rax,%r12
  call   <strlen@plt>
  mov    %eax,%r9d
  test   %eax,%eax
  je     L17
  movabs $0x6666666666666667,%r10
  sub    $0x1,%eax
  xor    %ecx,%ecx
  movslq %eax,%rdx
  mov    %eax,%eax
  lea    0x0(%rbp,%rdx,1),%r8
  mov    %rsp,%rbp
  lea    0x1(%rsp,%rax,1),%r11
  mov    %rbp,%rdi
  nopw   0x0(%rax,%rax,1)
L8:
  movsbl (%r8),%esi
  add    $0x1,%rdi
  sub    $0x1,%r8
  sub    $0x30,%esi
  movslq %esi,%rsi
  imul   %r12,%rsi
  add    %rcx,%rsi
  mov    %rsi,%rax
  imul   %r10
  mov    %rsi,%rax
  sar    $0x3f,%rax
  sar    $0x2,%rdx
  mov    %rdx,%rcx
  sub    %rax,%rcx
  mov    %rsi,%rax
  lea    (%rcx,%rcx,4),%rdx
  add    %rdx,%rdx
  sub    %rdx,%rax
  add    $0x30,%eax
  mov    %al,-0x1(%rdi)
  cmp    %rdi,%r11
  jne    L8
  cmp    $0x63,%rsi
  jle    L58
  lea    0x1(%r9),%esi
  lea    -0x1(%rsp),%r10
  movabs $0x6666666666666667,%r8
  movslq %esi,%rsi
  nopl   0x0(%rax,%rax,1)
L1:
  mov    %rcx,%rax
  mov    %esi,%r9d
  imul   %r8
  mov    %rcx,%rax
  sar    $0x3f,%rax
  sar    $0x2,%rdx
  sub    %rax,%rdx
  lea    (%rdx,%rdx,4),%rdi
  mov    %rdx,%rax
  mov    %rcx,%rdx
  add    %rdi,%rdi
  sub    %rdi,%rdx
  mov    %rcx,%rdi
  mov    %rax,%rcx
  add    $0x30,%edx
  mov    %dl,(%r10,%rsi,1)
  add    $0x1,%rsi
  cmp    $0x63,%rdi
  jg     L1
L70:
  movslq %r9d,%rax
  add    $0x30,%ecx
  add    $0x1,%r9d
  mov    %cl,(%rsp,%rax,1)
L67:
  movslq %r9d,%r9
  mov    %rbp,%rdi
  movb   $0x0,(%rsp,%r9,1)
  call   <strlen@plt>
  test   %eax,%eax
  jle    L11
  movslq %eax,%rdi
  sub    $0x1,%eax
  mov    %rbx,%rdx
  lea    -0x1(%rbp,%rdi,1),%rcx
  lea    0x1(%rbx,%rax,1),%rsi
  nopw   0x0(%rax,%rax,1)
L41:
  movzbl (%rcx),%eax
  add    $0x1,%rdx
  sub    $0x1,%rcx
  mov    %al,-0x1(%rdx)
  cmp    %rdx,%rsi
  jne    L41
  add    %rdi,%rbx
L11:
  movb   $0x0,(%rbx)
  mov    0x7d8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L19
  add    $0x7e0,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L58:
  cmp    $0x9,%rsi
  jle    L67
  jmp    L70
  nopl   0x0(%rax,%rax,1)
L17:
  xor    %r9d,%r9d
  mov    %rsp,%rbp
  jmp    L67
L19:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void Multiplica(char Multiplicando[], char Multiplicador[], char Produto[]) {
  char Buffer[2001];
  int digito, j, resto = 0, i = 0;
  long int Parcial, Quociente = 0;
  long int Auxiliar1 = atol(Multiplicando);
  int Tamanho_string = strlen(Multiplicador);
  Tamanho_string--;
  while (Tamanho_string != -1) {
    digito = Multiplicador[Tamanho_string] - 48;
    Parcial = Auxiliar1 * digito;
    Parcial = Parcial + Quociente;
    Quociente = Parcial / 10;
    resto = Parcial % 10;
    Buffer[i] = resto + 48;
    i++;
    Tamanho_string--;
  }
  while (Quociente >= 10) {
    resto = Quociente % 10;
    Quociente = Quociente / 10;
    Buffer[i] = resto + 48;
    i++;
  }
  if (Quociente > 0) {
    Buffer[i] = Quociente + 48;
    i++;
  }
  Buffer[i] = '\0';
  Tamanho_string = strlen(Buffer);
  for (i = 0, j = Tamanho_string - 1; i < Tamanho_string; i++, j--) {
    Produto[i] = Buffer[j];
  }
  Produto[i] = '\0';
}
```