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

```asm
<session>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  mov    %rdi,%r13
  push   %r12
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  sub    $0x88,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x78(%rsp)
  xor    %eax,%eax
  call   <atrf_open@plt>
  test   %rax,%rax
  je     L112
  test   %r13,%r13
  mov    %rax,%r12
  lea    D46(%rip),%rax
  mov    %rbp,%rdi
  cmove  %rax,%r13
  lea    D18(%rip),%rsi
  xor    %eax,%eax
  mov    %r13,%rdx
  call   <netio_printf@plt>
  test   %rax,%rax
  js     L146
  lea    0xf(%rsp),%r14
  lea    0x10(%rsp),%rbx
  lea    D7(%rip),%r13
  lea    D48(%rip),%r15
L73:
  mov    %r14,%r8
  mov    $0x64,%ecx
  mov    %rbx,%rdx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  call   <netio_read_until@plt>
  test   %rax,%rax
  jne    L63
  cmpb   $0x0,0xf(%rsp)
  jne    L70
L146:
  mov    0x78(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L118
  add    $0x88,%rsp
  mov    %r12,%rdi
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    10e0 <atrf_close@plt>
  xchg   %ax,%ax
L63:
  movb   $0x0,0x10(%rsp,%rax,1)
  movzbl 0xf(%rsp),%eax
  cmp    $0x20,%al
  je     L69
  jg     L128
  test   %al,%al
  je     L146
  cmp    $0xa,%al
  jne    L128
  mov    %rbx,%rdx
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <cmd_zero@plt>
  test   %eax,%eax
  jns    L73
  jmp    L146
  nopl   0x0(%rax)
L69:
  mov    %rbx,%rdx
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <cmd_more@plt>
  test   %eax,%eax
  jns    L73
  jmp    L146
  nopl   0x0(%rax,%rax,1)
L128:
  xor    %eax,%eax
  call   <abort@plt>
  jmp    L73
  nopl   0x0(%rax)
L70:
  mov    %r15,%rsi
  mov    %rbp,%rdi
  call   <netio_printf@plt>
  jmp    L73
L112:
  mov    0x78(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L118
  add    $0x88,%rsp
  mov    %rbp,%rdi
  lea    D3(%rip),%rsi
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1130 <netio_printf@plt>
L118:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: label: D46
type_guessed: string
name: parse_data
arguments: label: D18
type_guessed: string
name: parse_data
arguments: label: D7
type_guessed: string
name: parse_data
arguments: label: D48
type_guessed: string
name: parse_data
arguments: label: D3
type_guessed: string

tool: D46: default

tool: D18: +connected to %s


tool: D7:  


tool: D48: -empty input


tool: D3: -unable to open driver


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