user: 提供的汇编代码用C语言表示会是什么样子：

```asm
<lned_run>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xa0,%rsp
  mov    %edi,-0x84(%rbp)
  mov    %rsi,-0x90(%rbp)
  mov    %rdx,-0x98(%rbp)
  mov    %rcx,-0xa0(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0xffffffff,-0x58(%rbp)
  movl   $0xffffffff,-0x54(%rbp)
  lea    -0x50(%rbp),%rax
  mov    $0x40,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  movl   $0x0,-0x70(%rbp)
  jmp    L120
L4:
  lea    -0x50(%rbp),%rdx
  mov    -0x70(%rbp),%eax
  cltq
  shl    $0x4,%rax
  add    %rax,%rdx
  mov    -0x70(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <tcgetattr@plt>
  mov    %eax,-0x6c(%rbp)
  cmpl   $0x0,-0x6c(%rbp)
  jns    L75
  cmpl   $0x1,-0x70(%rbp)
  jle    L37
L75:
  addl   $0x1,-0x70(%rbp)
L120:
  cmpl   $0x2,-0x70(%rbp)
  jle    L4
  mov    D6(%rip),%rax
  mov    (%rax),%esi
  mov    D40(%rip),%rax
  mov    (%rax),%eax
  lea    -0x58(%rbp),%rdx
  mov    %rdx,%rcx
  mov    $0x0,%edx
  mov    %eax,%edi
  call   <socketpair@plt>
  mov    %eax,-0x6c(%rbp)
  cmpl   $0x0,-0x6c(%rbp)
  js     L1
  lea    -0x50(%rbp),%rax
  add    $0x30,%rax
  mov    %rax,-0x68(%rbp)
  mov    -0x68(%rbp),%rcx
  mov    -0x50(%rbp),%rax
  mov    -0x48(%rbp),%rdx
  mov    %rax,(%rcx)
  mov    %rdx,0x8(%rcx)
  mov    -0x68(%rbp),%rax
  mov    (%rax),%edx
  mov    D46(%rip),%rax
  mov    (%rax),%ecx
  mov    D21(%rip),%rax
  mov    (%rax),%eax
  or     %ecx,%eax
  not    %eax
  and    %eax,%edx
  mov    -0x68(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x68(%rbp),%rax
  mov    0x8(%rax),%rdx
  mov    D52(%rip),%rax
  mov    (%rax),%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  movl   $0x1,(%rax)
  mov    -0x68(%rbp),%rax
  mov    0x8(%rax),%rdx
  mov    D50(%rip),%rax
  mov    (%rax),%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  movl   $0x0,(%rax)
  mov    D17(%rip),%rax
  mov    (%rax),%eax
  mov    -0x68(%rbp),%rdx
  mov    %eax,%esi
  mov    $0x0,%edi
  call   <tcsetattr@plt>
  mov    %eax,-0x6c(%rbp)
  cmpl   $0x0,-0x6c(%rbp)
  js     L67
  mov    $0x0,%eax
  call   <fork@plt>
  mov    %rax,-0x60(%rbp)
  cmpq   $0x0,-0x60(%rbp)
  jne    L32
  mov    -0x54(%rbp),%eax
  mov    $0x0,%esi
  mov    %eax,%edi
  call   <dup2@plt>
  mov    -0x54(%rbp),%eax
  mov    $0x1,%esi
  mov    %eax,%edi
  call   <dup2@plt>
  mov    $0x2,%edi
  call   <isatty@plt>
  test   %rax,%rax
  je     L134
  mov    -0x54(%rbp),%eax
  mov    $0x2,%esi
  mov    %eax,%edi
  call   <dup2@plt>
L134:
  mov    -0x58(%rbp),%eax
  mov    %eax,%edi
  call   <close@plt>
  mov    -0x54(%rbp),%eax
  mov    %eax,%edi
  call   <close@plt>
  jmp    L107
L32:
  mov    -0x54(%rbp),%eax
  mov    %eax,%edi
  call   <close@plt>
  mov    $0x2,%esi
  mov    $0x1,%edi
  call   <dup2@plt>
  mov    -0x58(%rbp),%eax
  mov    -0x98(%rbp),%rdx
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <shuttle@plt>
  mov    D49(%rip),%rax
  mov    (%rax),%edx
  mov    -0x58(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <shutdown@plt>
  jmp    L19
L101:
  lea    -0x10(%rbp),%rax
  mov    $0x1,%edx
  mov    %rax,%rsi
  mov    $0x1,%edi
  call   <write@plt>
L19:
  mov    -0x58(%rbp),%eax
  lea    -0x10(%rbp),%rcx
  mov    $0x1,%edx
  mov    %rcx,%rsi
  mov    %eax,%edi
  call   <read@plt>
  cmp    $0x1,%eax
  je     L101
  lea    -0x74(%rbp),%rax
  mov    %rax,%rdi
  call   <wait@plt>
  mov    D17(%rip),%rax
  mov    (%rax),%eax
  lea    -0x50(%rbp),%rdx
  mov    %eax,%esi
  mov    $0x0,%edi
  call   <tcsetattr@plt>
  mov    -0x74(%rbp),%eax
  jmp    L21
L37:
  nop
  jmp    L107
L1:
  nop
  jmp    L107
L67:
  nop
L107:
  mov    -0x90(%rbp),%rdx
  mov    -0x84(%rbp),%eax
  mov    -0xa0(%rbp),%rcx
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   *%rcx
L21:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L86
  call   <__stack_chk_fail@plt>
L86:
  leave
  ret
```

assistant: ```c
int lned_run(int argc, char **argv, const char *prompt, int (*worker)(int, char **)) {
  struct termios tc[4];
  struct termios *t;
  char cb[8];
  int sp[2] = {-1, -1};
  int i;
  int res;
  int st;
  pid_t pid;
  memset(tc, 0, sizeof(tc));
  for (i = 0; i < 3; i++) {
    res = tcgetattr(i, &(tc[i]));
    if (res < 0 && i < 2)
      goto Direct;
  }
  res = socketpair(AF_UNIX, SOCK_STREAM, 0, sp);
  if (res < 0)
    goto Direct;
  t = &(tc[3]);
  *t = tc[0];
  t->c_lflag &= ~(ECHO | ICANON);
  t->c_cc[VMIN] = 1;
  t->c_cc[VTIME] = 0;
  res = tcsetattr(0, TCSANOW, t);
  if (res < 0)
    goto Direct;
  pid = fork();
  if (pid == 0) {
    dup2(sp[1], 0);
    dup2(sp[1], 1);
    if (isatty(2))
      dup2(sp[1], 2);
    close(sp[0]);
    close(sp[1]);
    goto Direct;
  }
  close(sp[1]);
  dup2(1, 2);
  shuttle(sp[0], prompt);
  shutdown(sp[0], SHUT_WR);
  while (read(sp[0], cb, 1) == 1)
    write(1, cb, 1);
  wait(&st);
  tcsetattr(0, TCSANOW, &(tc[0]));
  return (st);
Direct:
  return (worker(argc, argv));
}
```