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

```asm
<fd_nrf8001_dispatch>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  sub    $0x81,%eax
  cmp    $0xe,%eax
  ja     L138
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D14(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D14(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    -0x1c(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <fd_nrf8001_decode_device_started_event@plt>
  jmp    L136
  mov    -0x1c(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <fd_nrf8001_decode_echo_event@plt>
  jmp    L136
  mov    -0x1c(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <fd_nrf8001_decode_hardware_error_event@plt>
  jmp    L136
  mov    -0x1c(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <fd_nrf8001_decode_command_response_event@plt>
  jmp    L136
  mov    -0x1c(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <fd_nrf8001_decode_connected_event@plt>
  jmp    L136
  mov    -0x1c(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <fd_nrf8001_decode_disconnected_event@plt>
  jmp    L136
  mov    -0x1c(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <fd_nrf8001_decode_bond_status_event@plt>
  jmp    L136
  mov    -0x1c(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <fd_nrf8001_decode_pipe_status_event@plt>
  jmp    L136
  mov    -0x1c(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <fd_nrf8001_decode_timing_event@plt>
  jmp    L136
  mov    -0x1c(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <fd_nrf8001_decode_display_key_event@plt>
  jmp    L136
  mov    -0x1c(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <fd_nrf8001_decode_key_request_event@plt>
  jmp    L136
  mov    -0x1c(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <fd_nrf8001_decode_data_credit_event@plt>
  jmp    L136
  mov    -0x1c(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <fd_nrf8001_decode_pipe_error_event@plt>
  jmp    L136
  mov    -0x1c(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <fd_nrf8001_decode_data_received_event@plt>
  jmp    L136
  mov    -0x1c(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <fd_nrf8001_decode_data_ack_event@plt>
  jmp    L136
L138:
  mov    $0x0,%eax
  call   <fd_nrf8001_error@plt>
  nop
L136:
  leave
  ret
```

assistant: ```c
void fd_nrf8001_dispatch(uint8_t *buffer, uint32_t length) {
  uint8_t op = buffer[0];
  switch (op) {
  case 0x81:
    fd_nrf8001_decode_device_started_event(buffer, length);
    break;
  case 0x82:
    fd_nrf8001_decode_echo_event(buffer, length);
    break;
  case 0x83:
    fd_nrf8001_decode_hardware_error_event(buffer, length);
    break;
  case 0x84:
    fd_nrf8001_decode_command_response_event(buffer, length);
    break;
  case 0x85:
    fd_nrf8001_decode_connected_event(buffer, length);
    break;
  case 0x86:
    fd_nrf8001_decode_disconnected_event(buffer, length);
    break;
  case 0x87:
    fd_nrf8001_decode_bond_status_event(buffer, length);
    break;
  case 0x88:
    fd_nrf8001_decode_pipe_status_event(buffer, length);
    break;
  case 0x89:
    fd_nrf8001_decode_timing_event(buffer, length);
    break;
  case 0x8e:
    fd_nrf8001_decode_display_key_event(buffer, length);
    break;
  case 0x8f:
    fd_nrf8001_decode_key_request_event(buffer, length);
    break;
  case 0x8a:
    fd_nrf8001_decode_data_credit_event(buffer, length);
    break;
  case 0x8d:
    fd_nrf8001_decode_pipe_error_event(buffer, length);
    break;
  case 0x8c:
    fd_nrf8001_decode_data_received_event(buffer, length);
    break;
  case 0x8b:
    fd_nrf8001_decode_data_ack_event(buffer, length);
    break;
  default:
    fd_nrf8001_error();
    return;
    break;
  }
}
```