user: 下面的汇编指令对应的C源代码是什么：

```asm
<session>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xa0,%rsp
  mov    %rdi,-0x98(%rbp)
  mov    %rsi,-0xa0(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x98(%rbp),%rax
  mov    %rax,%rdi
  call   <atrf_open@plt>
  mov    %rax,-0x80(%rbp)
  cmpq   $0x0,-0x80(%rbp)
  jne    L189
  mov    -0xa0(%rbp),%rax
  lea    D14(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <netio_printf@plt>
  jmp    L191
L189:
  cmpq   $0x0,-0x98(%rbp)
  je     L6
  mov    -0x98(%rbp),%rax
  jmp    L5
L6:
  lea    D45(%rip),%rax
L5:
  mov    -0xa0(%rbp),%rcx
  mov    %rax,%rdx
  lea    D4(%rip),%rax
  mov    %rax,%rsi
  mov    %rcx,%rdi
  mov    $0x0,%eax
  call   <netio_printf@plt>
  test   %rax,%rax
  js     L86
L107:
  lea    -0x81(%rbp),%rcx
  lea    -0x70(%rbp),%rdx
  mov    -0xa0(%rbp),%rax
  mov    %rcx,%r8
  mov    $0x64,%ecx
  lea    D26(%rip),%rsi
  mov    %rax,%rdi
  call   <netio_read_until@plt>
  mov    %rax,-0x78(%rbp)
  cmpq   $0x0,-0x78(%rbp)
  jne    L58
  movzbl -0x81(%rbp),%eax
  test   %al,%al
  je     L58
  mov    -0xa0(%rbp),%rax
  lea    D27(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <netio_printf@plt>
  jmp    L107
L58:
  lea    -0x70(%rbp),%rdx
  mov    -0x78(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  movzbl -0x81(%rbp),%eax
  movsbl %al,%eax
  cmp    $0x20,%eax
  je     L114
  cmp    $0x20,%eax
  jg     L138
  test   %eax,%eax
  je     L63
  cmp    $0xa,%eax
  je     L49
  jmp    L138
L114:
  lea    -0x70(%rbp),%rdx
  mov    -0xa0(%rbp),%rcx
  mov    -0x80(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <cmd_more@plt>
  test   %eax,%eax
  jns    L207
  jmp    L17
L49:
  lea    -0x70(%rbp),%rdx
  mov    -0xa0(%rbp),%rcx
  mov    -0x80(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <cmd_zero@plt>
  test   %eax,%eax
  jns    L149
  jmp    L17
L138:
  mov    $0x0,%eax
  call   <abort@plt>
  jmp    L107
L207:
  nop
  jmp    L107
L149:
  nop
  jmp    L107
L86:
  nop
  jmp    L17
L63:
  nop
L17:
  mov    -0x80(%rbp),%rax
  mov    %rax,%rdi
  call   <atrf_close@plt>
L191:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L148
  call   <__stack_chk_fail@plt>
L148:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_tag: D14
data_type: string
name: unpack_data
arguments: data_tag: D45
data_type: string
name: unpack_data
arguments: data_tag: D4
data_type: string
name: unpack_data
arguments: data_tag: D26
data_type: string
name: unpack_data
arguments: data_tag: D27
data_type: string

tool: D14: -unable to open driver


tool: D45: default

tool: D4: +connected to %s


tool: D26:  


tool: D27: -empty input


assistant: ```c
void session(const char *driver, struct netio *netio) {
  struct atrf_dsc *dsc;
  dsc = atrf_open(driver);
  if (!dsc) {
    netio_printf(netio, "-unable to open driver\n");
    return;
  }
  if (netio_printf(netio, "+connected to %s\n", driver ? driver : "default") < 0)
    goto done;
  while (1) {
    char buf[100];
    ssize_t got;
    char last;
    got = netio_read_until(netio, " \n", buf, sizeof(buf), &last);
    if (got < 0)
      break;
    if (!got && last) {
      netio_printf(netio, "-empty input\n");
      continue;
    }
    buf[got] = 0;
    switch (last) {
    case ' ':
      if (cmd_more(dsc, netio, buf) < 0)
        goto done;
      break;
    case '\n':
      if (cmd_zero(dsc, netio, buf) < 0)
        goto done;
      break;
    case 0:
      goto done;
    default:
      abort();
    }
  }
done:
  atrf_close(dsc);
}
```