user: 这段汇编代码用C语言表示是什么样的?

```asm
<usys_select>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  add    $0xffffffffffffff80,%rsp
  mov    %rdi,-0x58(%rbp)
  mov    %rsi,-0x60(%rbp)
  mov    %edx,-0x64(%rbp)
  mov    %rcx,-0x70(%rbp)
  mov    %r8d,-0x68(%rbp)
  mov    %r9,-0x78(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    -0x48(%rbp),%rax
  mov    %rax,%rdi
  call   <FD_ZERO@plt>
  lea    -0x44(%rbp),%rax
  mov    %rax,%rdi
  call   <FD_ZERO@plt>
  movq   $0x0,-0x18(%rbp)
  mov    -0x64(%rbp),%eax
  imul   $0x3e8,%eax,%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x70(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x40(%rbp)
  movl   $0x0,-0x3c(%rbp)
  jmp    L148
L133:
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  js     L135
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  lea    -0x48(%rbp),%rdx
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <FD_SET@plt>
L135:
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x40(%rbp)
  jge    L79
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x40(%rbp)
L79:
  addq   $0x4,-0x28(%rbp)
  addl   $0x1,-0x3c(%rbp)
L148:
  mov    -0x3c(%rbp),%eax
  cmp    -0x68(%rbp),%eax
  jl     L133
  mov    -0x78(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  movl   $0x0,-0x38(%rbp)
  jmp    L78
L7:
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  js     L168
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  lea    -0x44(%rbp),%rdx
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <FD_SET@plt>
L168:
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x40(%rbp)
  jge    L144
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x40(%rbp)
L144:
  addq   $0x4,-0x28(%rbp)
  addl   $0x1,-0x38(%rbp)
L78:
  mov    -0x38(%rbp),%eax
  cmp    0x10(%rbp),%eax
  jl     L7
  mov    -0x40(%rbp),%eax
  lea    0x1(%rax),%edi
  lea    -0x20(%rbp),%rcx
  lea    -0x44(%rbp),%rdx
  lea    -0x48(%rbp),%rax
  mov    %rcx,%r8
  mov    $0x0,%ecx
  mov    %rax,%rsi
  call   <select@plt>
  mov    %eax,-0x2c(%rbp)
  cmpl   $0x0,-0x2c(%rbp)
  jns    L150
  mov    $0x0,%eax
  jmp    L83
L150:
  mov    -0x70(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  movl   $0x0,-0x34(%rbp)
  jmp    L169
L82:
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  lea    -0x48(%rbp),%rdx
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <FD_ISSET@plt>
  test   %rax,%rax
  je     L44
  mov    -0x58(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x34(%rbp),%eax
  mov    $0x1,%esi
  mov    %eax,%ecx
  shl    %cl,%esi
  mov    %esi,%eax
  or     %eax,%edx
  mov    -0x58(%rbp),%rax
  mov    %edx,(%rax)
L44:
  addq   $0x4,-0x28(%rbp)
  addl   $0x1,-0x34(%rbp)
L169:
  mov    -0x34(%rbp),%eax
  cmp    -0x68(%rbp),%eax
  jl     L82
  mov    -0x78(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  movl   $0x0,-0x30(%rbp)
  jmp    L81
L112:
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  lea    -0x44(%rbp),%rdx
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <FD_ISSET@plt>
  test   %rax,%rax
  je     L3
  mov    -0x60(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x30(%rbp),%eax
  mov    $0x1,%esi
  mov    %eax,%ecx
  shl    %cl,%esi
  mov    %esi,%eax
  or     %eax,%edx
  mov    -0x60(%rbp),%rax
  mov    %edx,(%rax)
L3:
  addq   $0x4,-0x28(%rbp)
  addl   $0x1,-0x30(%rbp)
L81:
  mov    -0x30(%rbp),%eax
  cmp    0x10(%rbp),%eax
  jl     L112
  mov    $0x0,%eax
L83:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L159
  call   <__stack_chk_fail@plt>
L159:
  leave
  ret
```

assistant: ```c
uint32_t usys_select(uint32_t *rmask, uint32_t *wmask, int time, int *reads, int nreads, int *writes, int nwrites) {
  int *sock_p, max_fd, err;
  fd_set readfds, writefds;
  struct timeval tv;
  FD_ZERO(&readfds);
  FD_ZERO(&writefds);
  tv.tv_sec = 0;
  tv.tv_usec = (time * 1000);
  sock_p = reads;
  max_fd = *sock_p;
  for (int i = 0; i < nreads; i++) {
    if (*sock_p >= 0)
      FD_SET(*sock_p, &readfds);
    if (*sock_p > max_fd)
      max_fd = *sock_p;
    sock_p++;
  }
  sock_p = writes;
  for (int i = 0; i < nwrites; i++) {
    if (*sock_p >= 0)
      FD_SET(*sock_p, &writefds);
    if (*sock_p > max_fd)
      max_fd = *sock_p;
    sock_p++;
  }
  err = select(max_fd + 1, &readfds, &writefds, NULL, &tv);
  if (err < 0)
    return 0;
  sock_p = reads;
  for (int i = 0; i < nreads; i++) {
    if (FD_ISSET(*sock_p, &readfds))
      *rmask |= (0x01 << i);
    sock_p++;
  }
  sock_p = writes;
  for (int i = 0; i < nwrites; i++) {
    if (FD_ISSET(*sock_p, &writefds))
      *wmask |= (0x01 << i);
    sock_p++;
  }
  return 0;
}
```