user: 请从给定的汇编指令推导出C源代码:

```asm
<get_mh_type>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x8(%rbp)
  mov    %rsi,-0x10(%rbp)
  mov    %rdx,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  cmp    $0x7,%eax
  ja     L25
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D13(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D13(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  lea    D14(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <tprintf@plt>
  mov    -0x10(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <dissect_mobilityhdr_type_0@plt>
  jmp    L86
  lea    D46(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <tprintf@plt>
  mov    -0x10(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <dissect_mobilityhdr_type_1_2@plt>
  jmp    L86
  lea    D52(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <tprintf@plt>
  mov    -0x10(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <dissect_mobilityhdr_type_1_2@plt>
  jmp    L86
  lea    D14(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <tprintf@plt>
  mov    -0x10(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <dissect_mobilityhdr_type_3_4@plt>
  jmp    L86
  lea    D14(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <tprintf@plt>
  mov    -0x10(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <dissect_mobilityhdr_type_3_4@plt>
  jmp    L86
  lea    D14(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <tprintf@plt>
  mov    -0x10(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <dissect_mobilityhdr_type_5@plt>
  jmp    L86
  lea    D14(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <tprintf@plt>
  mov    -0x10(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <dissect_mobilityhdr_type_6@plt>
  jmp    L86
  lea    D14(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <tprintf@plt>
  mov    -0x10(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <dissect_mobilityhdr_type_7@plt>
  jmp    L86
L25:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,%esi
  lea    D107(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <tprintf@plt>
  nop
L86:
  nop
  leave
  ret
```

tool_calls: name: read_data
arguments: label: D14
data_type: string
name: read_data
arguments: label: D46
data_type: string
name: read_data
arguments: label: D52
data_type: string
name: read_data
arguments: label: D107
data_type: string

tool: D14: Binding Refresh Request Message 

tool: D46: Home Test Init Message 

tool: D52: Care-of Test Init Message 

tool: D107: Type %u is unknown. Error

assistant: ```c
void get_mh_type(struct pkt_buff *pkt, ssize_t *message_data_len, uint8_t *mh_type) {
  switch (*mh_type) {
  case 0x00:
    tprintf("Binding Refresh Request Message ");
    dissect_mobilityhdr_type_0(pkt, message_data_len);
    break;
  case 0x01:
    tprintf("Home Test Init Message ");
    dissect_mobilityhdr_type_1_2(pkt, message_data_len);
    break;
  case 0x02:
    tprintf("Care-of Test Init Message ");
    dissect_mobilityhdr_type_1_2(pkt, message_data_len);
    break;
  case 0x03:
    tprintf("Binding Refresh Request Message ");
    dissect_mobilityhdr_type_3_4(pkt, message_data_len);
    break;
  case 0x04:
    tprintf("Binding Refresh Request Message ");
    dissect_mobilityhdr_type_3_4(pkt, message_data_len);
    break;
  case 0x05:
    tprintf("Binding Refresh Request Message ");
    dissect_mobilityhdr_type_5(pkt, message_data_len);
    break;
  case 0x06:
    tprintf("Binding Refresh Request Message ");
    dissect_mobilityhdr_type_6(pkt, message_data_len);
    break;
  case 0x07:
    tprintf("Binding Refresh Request Message ");
    dissect_mobilityhdr_type_7(pkt, message_data_len);
    break;
  default:
    tprintf("Type %u is unknown. Error", *mh_type);
  }
}
```