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

```asm
<Multiplica>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x830,%rsp
  mov    %rdi,-0x818(%rbp)
  mov    %rsi,-0x820(%rbp)
  mov    %rdx,-0x828(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x800(%rbp)
  movl   $0x0,-0x808(%rbp)
  movq   $0x0,-0x7f8(%rbp)
  mov    -0x818(%rbp),%rax
  mov    %rax,%rdi
  call   <atol@plt>
  mov    %rax,-0x7f0(%rbp)
  mov    -0x820(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x804(%rbp)
  subl   $0x1,-0x804(%rbp)
  jmp    L31
L49:
  mov    -0x804(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x820(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x30,%eax
  mov    %eax,-0x7fc(%rbp)
  mov    -0x7fc(%rbp),%eax
  cltq
  mov    -0x7f0(%rbp),%rdx
  imul   %rdx,%rax
  mov    %rax,-0x7e8(%rbp)
  mov    -0x7f8(%rbp),%rax
  add    %rax,-0x7e8(%rbp)
  mov    -0x7e8(%rbp),%rcx
  movabs $0x6666666666666667,%rdx
  mov    %rcx,%rax
  imul   %rdx
  mov    %rdx,%rax
  sar    $0x2,%rax
  sar    $0x3f,%rcx
  mov    %rcx,%rdx
  sub    %rdx,%rax
  mov    %rax,-0x7f8(%rbp)
  mov    -0x7e8(%rbp),%rcx
  movabs $0x6666666666666667,%rdx
  mov    %rcx,%rax
  imul   %rdx
  mov    %rdx,%rax
  sar    $0x2,%rax
  mov    %rcx,%rsi
  sar    $0x3f,%rsi
  sub    %rsi,%rax
  mov    %rax,%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  add    %rax,%rax
  sub    %rax,%rcx
  mov    %rcx,%rdx
  mov    %edx,-0x800(%rbp)
  mov    -0x800(%rbp),%eax
  add    $0x30,%eax
  mov    %eax,%edx
  mov    -0x808(%rbp),%eax
  cltq
  mov    %dl,-0x7e0(%rbp,%rax,1)
  addl   $0x1,-0x808(%rbp)
  subl   $0x1,-0x804(%rbp)
L31:
  cmpl   $0xffffffff,-0x804(%rbp)
  jne    L49
  jmp    L25
L33:
  mov    -0x7f8(%rbp),%rcx
  movabs $0x6666666666666667,%rdx
  mov    %rcx,%rax
  imul   %rdx
  mov    %rdx,%rax
  sar    $0x2,%rax
  mov    %rcx,%rsi
  sar    $0x3f,%rsi
  sub    %rsi,%rax
  mov    %rax,%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  add    %rax,%rax
  sub    %rax,%rcx
  mov    %rcx,%rdx
  mov    %edx,-0x800(%rbp)
  mov    -0x7f8(%rbp),%rcx
  movabs $0x6666666666666667,%rdx
  mov    %rcx,%rax
  imul   %rdx
  mov    %rdx,%rax
  sar    $0x2,%rax
  sar    $0x3f,%rcx
  mov    %rcx,%rdx
  sub    %rdx,%rax
  mov    %rax,-0x7f8(%rbp)
  mov    -0x800(%rbp),%eax
  add    $0x30,%eax
  mov    %eax,%edx
  mov    -0x808(%rbp),%eax
  cltq
  mov    %dl,-0x7e0(%rbp,%rax,1)
  addl   $0x1,-0x808(%rbp)
L25:
  cmpq   $0x9,-0x7f8(%rbp)
  jg     L33
  cmpq   $0x0,-0x7f8(%rbp)
  jle    L35
  mov    -0x7f8(%rbp),%rax
  add    $0x30,%eax
  mov    %eax,%edx
  mov    -0x808(%rbp),%eax
  cltq
  mov    %dl,-0x7e0(%rbp,%rax,1)
  addl   $0x1,-0x808(%rbp)
L35:
  mov    -0x808(%rbp),%eax
  cltq
  movb   $0x0,-0x7e0(%rbp,%rax,1)
  lea    -0x7e0(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x804(%rbp)
  movl   $0x0,-0x808(%rbp)
  mov    -0x804(%rbp),%eax
  sub    $0x1,%eax
  mov    %eax,-0x80c(%rbp)
  jmp    L47
L61:
  mov    -0x808(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x828(%rbp),%rax
  add    %rax,%rdx
  mov    -0x80c(%rbp),%eax
  cltq
  movzbl -0x7e0(%rbp,%rax,1),%eax
  mov    %al,(%rdx)
  addl   $0x1,-0x808(%rbp)
  subl   $0x1,-0x80c(%rbp)
L47:
  mov    -0x808(%rbp),%eax
  cmp    -0x804(%rbp),%eax
  jl     L61
  mov    -0x808(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x828(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L39
  call   <__stack_chk_fail@plt>
L39:
  leave
  ret
```

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';
}
```