user: 请将以下的汇编代码转换成C语言代码：

```asm
<main>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rsi,%rbx
  cmp    $0x3,%edi
  je     L64
  lea    D27(%rip),%rdi
  call   <printf@plt>
  mov    $0x1,%edi
  call   <exit@plt>
L64:
  mov    0x8(%rbx),%r12
  mov    0x10(%rbx),%rbp
  xor    %eax,%eax
  call   <MostrarFuncionamiento@plt>
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <amigoConectado@plt>
  test   %rax,%rax
  je     L63
  lea    D1(%rip),%rbx
  jmp    L50
  nopw   0x0(%rax,%rax,1)
L89:
  call   <enviarMsj@plt>
  xor    %eax,%eax
  call   <recibirMsj@plt>
  mov    %rax,%rdi
  call   <mostrar@plt>
  xor    %eax,%eax
  call   <recibirMsj@plt>
  mov    %rbx,%rsi
  mov    %rax,%rdi
  mov    %rax,%rbp
  call   <strcmp@plt>
  test   %rax,%rax
  je     L56
  mov    %rbp,%rdi
  call   <Preguntas@plt>
  mov    %rbp,%rdi
  call   <enviarMsj@plt>
L50:
  xor    %eax,%eax
  call   <Menu@plt>
  xor    %eax,%eax
  call   <ingresarMensaje@plt>
  mov    %rbx,%rsi
  mov    %rax,%rdi
  mov    %rax,%rbp
  call   <strcmp@plt>
  mov    %rbp,%rdi
  test   %rax,%rax
  jne    L89
L54:
  call   <enviarMsj@plt>
L56:
  xor    %eax,%eax
  call   <cerrarSesion@plt>
  xor    %edi,%edi
  call   <exit@plt>
  pop    %rbx
  xor    %eax,%eax
  pop    %rbp
  pop    %r12
  ret
L63:
  mov    %rbp,%rdi
  lea    D1(%rip),%rbx
  call   <iniciarServicio@plt>
  jmp    L71
  nopl   (%rax)
L51:
  call   <enviarMsj@plt>
  xor    %eax,%eax
  call   <recibirMsj@plt>
  mov    %rax,%rdi
  call   <mostrar@plt>
L71:
  xor    %eax,%eax
  call   <recibirMsj@plt>
  mov    %rbx,%rsi
  mov    %rax,%rdi
  mov    %rax,%rbp
  call   <strcmp@plt>
  test   %rax,%rax
  je     L56
  mov    %rbp,%rdi
  call   <Preguntas@plt>
  mov    %rbp,%rdi
  call   <enviarMsj@plt>
  xor    %eax,%eax
  call   <Menu@plt>
  xor    %eax,%eax
  call   <ingresarMensaje@plt>
  mov    %rbx,%rsi
  mov    %rax,%rdi
  mov    %rax,%rbp
  call   <strcmp@plt>
  mov    %rbp,%rdi
  test   %rax,%rax
  jne    L51
  jmp    L54
```

tool_calls: name: unpack_data
arguments: data_label: D27
type_guessed: string
name: unpack_data
arguments: data_label: D1
type_guessed: string

tool: D27: Cantidad de parametros invalido, debe ingresar <IP AMIGO,PUERTO> -


tool: D1: 5


assistant: ```c
int main(int argc, char **argv) {
  char *amigo;
  char *mensaje;
  char *puerto;
  if (argc < 3 || argc > 3) {
    printf("Cantidad de parametros invalido, debe ingresar <IP AMIGO,PUERTO> -\n");
    exit(1);
  }
  amigo = argv[1];
  puerto = argv[2];
  MostrarFuncionamiento();
  if (amigoConectado(amigo, puerto)) {
    while (1) {
      Menu();
      mensaje = ingresarMensaje();
      if (strcmp(mensaje, "5\n") == 0) {
        enviarMsj(mensaje);
        break;
      }
      enviarMsj(mensaje);
      mensaje = recibirMsj();
      mostrar(mensaje);
      mensaje = recibirMsj();
      if (strcmp(mensaje, "5\n") == 0)
        break;
      Preguntas(mensaje);
      enviarMsj(mensaje);
    }
    cerrarSesion();
  } else {
    iniciarServicio(puerto);
    while (1) {
      mensaje = recibirMsj();
      if (strcmp(mensaje, "5\n") == 0)
        break;
      Preguntas(mensaje);
      enviarMsj(mensaje);
      Menu();
      mensaje = ingresarMensaje();
      if (strcmp(mensaje, "5\n") == 0) {
        enviarMsj(mensaje);
        break;
      }
      enviarMsj(mensaje);
      mensaje = recibirMsj();
      mostrar(mensaje);
    }
    cerrarSesion();
  }
  exit(0);
}
```