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

```asm
<Multiplica>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x7e0,%rsp
  mov    %rsi,%r12
  mov    %rdx,%rbx
  mov    %fs:0x28,%rax
  mov    %rax,0x7d8(%rsp)
  xor    %eax,%eax
  call   <atol@plt>
  mov    %rax,%rbp
  mov    %r12,%rdi
  call   <strlen@plt>
  mov    %eax,%r9d
  test   %eax,%eax
  je     L8
  lea    -0x1(%rax),%eax
  cltq
  lea    (%r12,%rax,1),%r8
  mov    %rsp,%rdi
  lea    -0x1(%r9),%eax
  lea    0x1(%rsp,%rax,1),%r11
  mov    $0x0,%ecx
  movabs $0x6666666666666667,%r10
L14:
  movsbl (%r8),%esi
  sub    $0x30,%esi
  movslq %esi,%rsi
  imul   %rbp,%rsi
  add    %rcx,%rsi
  mov    %rsi,%rax
  imul   %r10
  sar    $0x2,%rdx
  mov    %rsi,%rax
  sar    $0x3f,%rax
  mov    %rdx,%rcx
  sub    %rax,%rcx
  lea    (%rcx,%rcx,4),%rdx
  add    %rdx,%rdx
  mov    %rsi,%rax
  sub    %rdx,%rax
  add    $0x30,%eax
  mov    %al,(%rdi)
  sub    $0x1,%r8
  add    $0x1,%rdi
  cmp    %r11,%rdi
  jne    L14
  cmp    $0x63,%rsi
  jle    L1
  lea    0x1(%r9),%esi
  movslq %esi,%rsi
  movabs $0x6666666666666667,%r8
  lea    -0x1(%rsp),%rdi
L28:
  mov    %rcx,%rax
  imul   %r8
  sar    $0x2,%rdx
  mov    %rcx,%rax
  sar    $0x3f,%rax
  sub    %rax,%rdx
  mov    %rdx,%r9
  lea    (%rdx,%rdx,4),%rax
  add    %rax,%rax
  mov    %rcx,%rdx
  sub    %rax,%rdx
  mov    %rcx,%rax
  mov    %r9,%rcx
  add    $0x30,%edx
  mov    %dl,(%rdi,%rsi,1)
  mov    %esi,%r9d
  add    $0x1,%rsi
  cmp    $0x63,%rax
  jg     L28
L1:
  test   %rcx,%rcx
  jle    L76
  movslq %r9d,%rax
  add    $0x30,%ecx
  mov    %cl,(%rsp,%rax,1)
  add    $0x1,%r9d
L76:
  movslq %r9d,%r9
  movb   $0x0,(%rsp,%r9,1)
  mov    %rsp,%rdi
  call   <strlen@plt>
  test   %eax,%eax
  jle    L22
  movslq %eax,%rsi
  lea    (%rsp,%rsi,1),%rdx
  mov    %rbx,%rcx
  lea    -0x1(%rsp,%rsi,1),%rdi
  lea    -0x1(%rax),%esi
  sub    %rsi,%rdi
L45:
  movzbl -0x1(%rdx),%esi
  mov    %sil,(%rcx)
  sub    $0x1,%rdx
  add    $0x1,%rcx
  cmp    %rdi,%rdx
  jne    L45
L0:
  cltq
  movb   $0x0,(%rbx,%rax,1)
  mov    0x7d8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L97
  add    $0x7e0,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L8:
  mov    $0x0,%r9d
  jmp    L76
L22:
  mov    $0x0,%eax
  jmp    L0
L97:
  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';
}
```