user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<main>:
  endbr64
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    %rsi,%rbx
  cmp    $0x3,%edi
  jne    L36
L76:
  mov    0x8(%rbx),%rbp
  mov    0x10(%rbx),%rbx
  mov    $0x0,%eax
  call   <MostrarFuncionamiento@plt>
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  call   <amigoConectado@plt>
  test   %rax,%rax
  je     L79
  lea    D22(%rip),%rbp
L41:
  mov    $0x0,%eax
  call   <Menu@plt>
  mov    $0x0,%eax
  call   <ingresarMensaje@plt>
  mov    %rax,%rbx
  mov    %rbp,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L32
  mov    %rbx,%rdi
  call   <enviarMsj@plt>
  mov    $0x0,%eax
  call   <recibirMsj@plt>
  mov    %rax,%rdi
  call   <mostrar@plt>
  mov    $0x0,%eax
  call   <recibirMsj@plt>
  mov    %rax,%rbx
  mov    %rbp,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L1
  mov    %rbx,%rdi
  call   <Preguntas@plt>
  mov    %rbx,%rdi
  call   <enviarMsj@plt>
  jmp    L41
L36:
  lea    D8(%rip),%rdi
  call   <printf@plt>
  mov    $0x1,%edi
  call   <exit@plt>
  jmp    L76
L32:
  mov    %rbx,%rdi
  call   <enviarMsj@plt>
L1:
  mov    $0x0,%eax
  call   <cerrarSesion@plt>
L26:
  mov    $0x0,%edi
  call   <exit@plt>
  mov    $0x0,%eax
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  ret
L79:
  mov    %rbx,%rdi
  call   <iniciarServicio@plt>
  lea    D22(%rip),%rbp
L7:
  mov    $0x0,%eax
  call   <recibirMsj@plt>
  mov    %rax,%rbx
  mov    %rbp,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L10
  mov    %rbx,%rdi
  call   <Preguntas@plt>
  mov    %rbx,%rdi
  call   <enviarMsj@plt>
  mov    $0x0,%eax
  call   <Menu@plt>
  mov    $0x0,%eax
  call   <ingresarMensaje@plt>
  mov    %rax,%rbx
  mov    %rbp,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L51
  mov    %rbx,%rdi
  call   <enviarMsj@plt>
  mov    $0x0,%eax
  call   <recibirMsj@plt>
  mov    %rax,%rdi
  call   <mostrar@plt>
  jmp    L7
L51:
  mov    %rbx,%rdi
  call   <enviarMsj@plt>
L10:
  mov    $0x0,%eax
  call   <cerrarSesion@plt>
  jmp    L26
```

tool_calls: name: unpack_data
arguments: data_tag: D22
type_guessed: string
name: unpack_data
arguments: data_tag: D8
type_guessed: string

tool: D22: 5


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


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