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

```asm
<service_client>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xd0,%rsp
  mov    %edi,-0xc4(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    D25(%rip),%rax
  mov    %rax,-0xb0(%rbp)
  lea    D26(%rip),%rax
  mov    %rax,-0xa8(%rbp)
  lea    D34(%rip),%rax
  mov    %rax,-0xa0(%rbp)
  lea    D40(%rip),%rax
  mov    %rax,-0x98(%rbp)
  lea    D0(%rip),%rax
  mov    %rax,-0xb8(%rbp)
  movabs $0x6d6974207478654e,%rax
  movabs $0x6f73207961732065,%rdx
  mov    %rax,-0x80(%rbp)
  mov    %rdx,-0x78(%rbp)
  movabs $0xd676e696874656d,%rax
  mov    %rax,-0x70(%rbp)
  movw   $0xa,-0x68(%rbp)
  movabs $0x6e6120676e6f7257,%rax
  mov    %rax,-0x8f(%rbp)
  movl   $0x72657773,-0x87(%rbp)
  movw   $0xa0d,-0x83(%rbp)
  movb   $0x0,-0x81(%rbp)
  movl   $0x0,-0xbc(%rbp)
  jmp    L17
L59:
  mov    -0xbc(%rbp),%eax
  cltq
  mov    -0xb0(%rbp,%rax,8),%rdx
  mov    -0xc4(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <say@plt>
  lea    -0x60(%rbp),%rcx
  mov    -0xc4(%rbp),%eax
  mov    $0x50,%edx
  mov    %rcx,%rsi
  mov    %eax,%edi
  call   <read_in@plt>
  cmp    $0x2,%eax
  jg     L58
  lea    -0x80(%rbp),%rdx
  mov    -0xc4(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <disconnect_client@plt>
  jmp    L38
L58:
  mov    -0xbc(%rbp),%eax
  cltq
  mov    -0xa0(%rbp,%rax,8),%rcx
  lea    -0x60(%rbp),%rax
  mov    $0x50,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncasecmp@plt>
  test   %rax,%rax
  je     L14
  lea    -0x8f(%rbp),%rdx
  mov    -0xc4(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <disconnect_client@plt>
  jmp    L38
L14:
  addl   $0x1,-0xbc(%rbp)
L17:
  cmpl   $0x1,-0xbc(%rbp)
  jle    L59
  mov    -0xb8(%rbp),%rdx
  mov    -0xc4(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <disconnect_client@plt>
L38:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L48
  call   <__stack_chk_fail@plt>
L48:
  leave
  ret
```

tool_calls: name: read_data
arguments: data_label: D25
type_infered: string
name: read_data
arguments: data_label: D26
type_infered: string
name: read_data
arguments: data_label: D34
type_infered: string
name: read_data
arguments: data_label: D40
type_infered: string
name: read_data
arguments: data_label: D0
type_infered: string

tool: D25: Knock! Knock!


tool: D26: Oscar


tool: D34: Who's there?

tool: D40: Oscar who?

tool: D0: Oscar silly question, you get a silly answer


assistant: ```c
void service_client(int socket) {
  char *questions[] = {
      "Knock! Knock!\r\n",
      "Oscar\r\n",
  };
  char *valid_answers[] = {
      "Who's there?",
      "Oscar who?",
  };
  char *final_sentence = "Oscar silly question, you get a silly answer\r\n";
  char answer[80];
  char silence[] = "Next time say something\r\n";
  char wrong_answer[] = "Wrong answer\r\n";
  int i;
  for (i = 0; i < 2; i++) {
    say(socket, questions[i]);
    if (read_in(socket, answer, 80) < 3) {
      disconnect_client(socket, silence);
      return;
    } else if (strncasecmp(answer, valid_answers[i], 80) != 0) {
      disconnect_client(socket, wrong_answer);
      return;
    }
  }
  disconnect_client(socket, final_sentence);
}
```