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

```asm
<genieOpen>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  sub    $0x30,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x28(%rsp)
  xor    %eax,%eax
  cmp    $0x4b0,%esi
  je     L40
  jg     L5
  cmp    $0x96,%esi
  je     L342
  jle    L13
  cmp    $0x12c,%esi
  je     L97
  cmp    $0x258,%esi
  jne    L391
  mov    D37(%rip),%rax
  mov    (%rax),%ebp
  nopw   0x0(%rax,%rax,1)
L314:
  mov    D147(%rip),%rax
  mov    D315(%rip),%r13
  mov    0x0(%r13),%esi
  or     (%rax),%esi
  mov    D362(%rip),%rax
  or     (%rax),%esi
  mov    D50(%rip),%rax
  or     (%rax),%esi
  call   <open@plt>
  mov    %eax,%r12d
  cmp    $0xffffffff,%eax
  je     L252
  mov    D130(%rip),%rax
  mov    0x0(%r13),%edx
  mov    %r12d,%edi
  lea    0x10(%rsp),%r13
  mov    (%rax),%esi
  call   <fcntl@plt>
  mov    %r13,%rsi
  mov    %r12d,%edi
  call   <tcgetattr@plt>
  mov    %r13,%rdi
  call   <cfmakeraw@plt>
  mov    %r13,%rdi
  mov    %ebp,%esi
  call   <cfsetispeed@plt>
  mov    %r13,%rdi
  mov    %ebp,%esi
  call   <cfsetospeed@plt>
  mov    D377(%rip),%rdx
  mov    D151(%rip),%rax
  mov    %r12d,%edi
  mov    D252(%rip),%rcx
  mov    (%rax),%eax
  or     (%rdx),%eax
  mov    D221(%rip),%rdx
  or     (%rdx),%eax
  mov    0x10(%rsp),%edx
  or     (%rcx),%edx
  mov    D326(%rip),%rcx
  not    %eax
  or     (%rcx),%edx
  mov    D406(%rip),%rcx
  and    %edx,%eax
  mov    D170(%rip),%rdx
  or     (%rdx),%eax
  mov    D219(%rip),%rdx
  movd   %eax,%xmm0
  mov    D177(%rip),%rax
  mov    (%rdx),%edx
  or     (%rcx),%edx
  mov    D89(%rip),%rcx
  mov    (%rax),%eax
  or     (%rcx),%edx
  mov    D337(%rip),%rcx
  not    %eax
  and    %eax,0x20(%rsp)
  mov    0x18(%rsp),%rax
  or     (%rcx),%edx
  not    %edx
  and    0x14(%rsp),%edx
  movd   %edx,%xmm1
  mov    D328(%rip),%rdx
  punpckldq %xmm1,%xmm0
  mov    (%rdx),%rdx
  movq   %xmm0,0x10(%rsp)
  movl   $0x0,(%rax,%rdx,4)
  mov    D16(%rip),%rdx
  mov    (%rdx),%rdx
  movl   $0x64,(%rax,%rdx,4)
  mov    D138(%rip),%rax
  mov    %r13,%rdx
  lea    0xc(%rsp),%r13
  mov    (%rax),%esi
  mov    D225(%rip),%rax
  or     (%rax),%esi
  call   <tcsetattr@plt>
  mov    D127(%rip),%rax
  mov    %r13,%rdx
  mov    %r12d,%edi
  mov    (%rax),%esi
  call   <ioctl@plt>
  mov    D345(%rip),%rdx
  mov    0xc(%rsp),%eax
  mov    %r12d,%edi
  or     (%rdx),%eax
  mov    D258(%rip),%rdx
  or     (%rdx),%eax
  mov    %r13,%rdx
  mov    %eax,0xc(%rsp)
  mov    D193(%rip),%rax
  mov    (%rax),%esi
  call   <ioctl@plt>
  mov    $0x2710,%edi
  call   <usleep@plt>
L252:
  mov    0x28(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L272
  add    $0x30,%rsp
  mov    %r12d,%eax
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
L391:
  cmp    $0xc8,%esi
  jne    L227
  mov    D256(%rip),%rax
  mov    (%rax),%ebp
  jmp    L314
  nopl   0x0(%rax)
L13:
  cmp    $0x6e,%esi
  je     L320
  jle    L330
  cmp    $0x86,%esi
  jne    L227
  mov    D399(%rip),%rax
  mov    (%rax),%ebp
  jmp    L314
  nopl   (%rax)
L5:
  cmp    $0x9600,%esi
  je     L311
  jle    L108
  cmp    $0x1c200,%esi
  je     L244
  cmp    $0x38400,%esi
  jne    L67
  mov    D294(%rip),%rax
  mov    (%rax),%ebp
  jmp    L314
  nopl   0x0(%rax,%rax,1)
L330:
  cmp    $0x32,%esi
  je     L268
  cmp    $0x4b,%esi
  jne    L227
  mov    D192(%rip),%rax
  mov    (%rax),%ebp
  jmp    L314
L67:
  cmp    $0xe100,%esi
  jne    L227
  mov    D268(%rip),%rax
  mov    (%rax),%ebp
  jmp    L314
  cs nopw 0x0(%rax,%rax,1)
L108:
  cmp    $0x2580,%esi
  je     L310
  jle    L23
  cmp    $0x4b00,%esi
  jne    L227
  mov    D118(%rip),%rax
  mov    (%rax),%ebp
  jmp    L314
  nopl   0x0(%rax)
L23:
  cmp    $0x708,%esi
  je     L334
  cmp    $0x960,%esi
  jne    L227
  mov    D331(%rip),%rax
  mov    (%rax),%ebp
  jmp    L314
  nopw   0x0(%rax,%rax,1)
L227:
  mov    $0xfffffffe,%r12d
  jmp    L252
  nopl   0x0(%rax,%rax,1)
L97:
  mov    D121(%rip),%rax
  mov    (%rax),%ebp
  jmp    L314
  xchg   %ax,%ax
L320:
  mov    D200(%rip),%rax
  mov    (%rax),%ebp
  jmp    L314
  xchg   %ax,%ax
L311:
  mov    D220(%rip),%rax
  mov    (%rax),%ebp
  jmp    L314
  xchg   %ax,%ax
L244:
  mov    D403(%rip),%rax
  mov    (%rax),%ebp
  jmp    L314
  xchg   %ax,%ax
L268:
  mov    D157(%rip),%rax
  mov    (%rax),%ebp
  jmp    L314
  xchg   %ax,%ax
L310:
  mov    D5(%rip),%rax
  mov    (%rax),%ebp
  jmp    L314
  xchg   %ax,%ax
L334:
  mov    D395(%rip),%rax
  mov    (%rax),%ebp
  jmp    L314
  xchg   %ax,%ax
L40:
  mov    D142(%rip),%rax
  mov    (%rax),%ebp
  jmp    L314
  xchg   %ax,%ax
L342:
  mov    D384(%rip),%rax
  mov    (%rax),%ebp
  jmp    L314
L272:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
int genieOpen(char *device, int baud) {
  struct termios options;
  speed_t myBaud;
  int status, fd;
  switch (baud) {
  case 50:
    myBaud = B50;
    break;
  case 75:
    myBaud = B75;
    break;
  case 110:
    myBaud = B110;
    break;
  case 134:
    myBaud = B134;
    break;
  case 150:
    myBaud = B150;
    break;
  case 200:
    myBaud = B200;
    break;
  case 300:
    myBaud = B300;
    break;
  case 600:
    myBaud = B600;
    break;
  case 1200:
    myBaud = B1200;
    break;
  case 1800:
    myBaud = B1800;
    break;
  case 2400:
    myBaud = B2400;
    break;
  case 9600:
    myBaud = B9600;
    break;
  case 19200:
    myBaud = B19200;
    break;
  case 38400:
    myBaud = B38400;
    break;
  case 57600:
    myBaud = B57600;
    break;
  case 115200:
    myBaud = B115200;
    break;
  case 230400:
    myBaud = B230400;
    break;
  default:
    return -2;
  }
  if ((fd = open(device, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK)) == -1)
    return -1;
  fcntl(fd, F_SETFL, O_RDWR);
  tcgetattr(fd, &options);
  cfmakeraw(&options);
  cfsetispeed(&options, myBaud);
  cfsetospeed(&options, myBaud);
  options.c_cflag |= (CLOCAL | CREAD);
  options.c_cflag &= ~PARENB;
  options.c_cflag &= ~CSTOPB;
  options.c_cflag &= ~CSIZE;
  options.c_cflag |= CS8;
  options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
  options.c_oflag &= ~OPOST;
  options.c_cc[VMIN] = 0;
  options.c_cc[VTIME] = 100;
  tcsetattr(fd, TCSANOW | TCSAFLUSH, &options);
  ioctl(fd, TIOCMGET, &status);
  status |= TIOCM_DTR;
  status |= TIOCM_RTS;
  ioctl(fd, TIOCMSET, &status);
  usleep(10000);
  return fd;
}
```