user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<int_crb_dispatch>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x8(%rbp)
  mov    %rsi,-0x10(%rbp)
  mov    %rdx,-0x18(%rbp)
  mov    %rcx,-0x20(%rbp)
  mov    %r8,-0x28(%rbp)
  cmpq   $0x30,-0x8(%rbp)
  ja     L0
  mov    -0x8(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  lea    D12(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D12(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    -0x10(%rbp),%rax
  mov    %rax,%rdi
  call   <crb_getc@plt>
  jmp    L49
  mov    -0x18(%rbp),%rcx
  mov    -0x20(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <crb_puts@plt>
  jmp    L49
  mov    -0x10(%rbp),%rax
  mov    %rax,%rdi
  call   <crb_reset_term@plt>
  jmp    L49
  mov    -0x18(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <crb_set_term_int@plt>
  jmp    L49
  mov    -0x18(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <crb_set_term_ctl@plt>
  jmp    L49
  mov    -0x20(%rbp),%rdx
  mov    -0x18(%rbp),%rcx
  mov    -0x10(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <crb_process_keycode@plt>
  jmp    L49
  mov    -0x10(%rbp),%rax
  mov    -0x18(%rbp),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <crb_open@plt>
  jmp    L49
  mov    -0x10(%rbp),%rax
  mov    %rax,%rdi
  call   <crb_close@plt>
  jmp    L49
  mov    -0x10(%rbp),%rax
  mov    %rax,%rdi
  call   <crb_ioctl@plt>
  jmp    L49
  mov    -0x20(%rbp),%rdx
  mov    -0x28(%rbp),%rcx
  mov    -0x18(%rbp),%rsi
  mov    -0x10(%rbp),%rax
  mov    %rax,%rdi
  call   <crb_read@plt>
  jmp    L49
  mov    -0x20(%rbp),%rdx
  mov    -0x28(%rbp),%rcx
  mov    -0x18(%rbp),%rsi
  mov    -0x10(%rbp),%rax
  mov    %rax,%rdi
  call   <crb_write@plt>
  jmp    L49
  mov    -0x18(%rbp),%rcx
  mov    -0x20(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <crb_set_env@plt>
  jmp    L49
  mov    -0x18(%rbp),%rcx
  mov    -0x20(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <crb_reset_env@plt>
  jmp    L49
  mov    -0x18(%rbp),%rcx
  mov    -0x20(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <crb_get_env@plt>
  jmp    L49
  mov    $0x0,%eax
  call   <crb_save_env@plt>
  jmp    L49
  mov    -0x18(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <crb_pswitch@plt>
  jmp    L49
L0:
  movabs $0x8000000000000000,%rax
L49:
  leave
  ret
```

assistant: ```c
unsigned long __attribute__((used)) int_crb_dispatch(long select, long a1, long a2, long a3, long a4) {
  switch (select) {
  case 0x01:
    return crb_getc(a1);
  case 0x02:
    return crb_puts(a1, (const char *)a2, a3);
  case 0x03:
    return crb_reset_term(a1);
  case 0x04:
    return crb_set_term_int(a1, a2);
  case 0x05:
    return crb_set_term_ctl(a1, a2);
  case 0x06:
    return crb_process_keycode(a1, a2, a3);
  case 0x10:
    return crb_open((const char *)a1, a2);
  case 0x11:
    return crb_close(a1);
  case 0x12:
    return crb_ioctl(a1);
  case 0x13:
    return crb_read(a1, a2, (char *)a3, a4);
  case 0x14:
    return crb_write(a1, a2, (const char *)a3, a4);
  case 0x20:
    return crb_set_env(a1, (const char *)a2, a3);
  case 0x21:
    return crb_reset_env(a1, (char *)a2, a3);
  case 0x22:
    return crb_get_env(a1, (char *)a2, a3);
  case 0x23:
    return crb_save_env();
  case 0x30:
    return crb_pswitch(a1, a2);
  }
  return 0x8000000000000000ul;
}
```