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

```asm
<icmp_code>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %edi,%edx
  mov    %esi,%eax
  mov    %dl,-0x4(%rbp)
  mov    %al,-0x8(%rbp)
  movzbl -0x4(%rbp),%eax
  cmp    $0x28,%eax
  ja     L26
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D60(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D60(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  cmpb   $0x0,-0x8(%rbp)
  jne    L53
  lea    D416(%rip),%rax
  jmp    L459
  movzbl -0x8(%rbp),%eax
  cmp    $0xf,%eax
  ja     L109
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D213(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D213(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  lea    D173(%rip),%rax
  jmp    L459
  lea    D31(%rip),%rax
  jmp    L459
  lea    D83(%rip),%rax
  jmp    L459
  lea    D3(%rip),%rax
  jmp    L459
  lea    D251(%rip),%rax
  jmp    L459
  lea    D88(%rip),%rax
  jmp    L459
  lea    D340(%rip),%rax
  jmp    L459
  lea    D349(%rip),%rax
  jmp    L459
  lea    D395(%rip),%rax
  jmp    L459
  lea    D264(%rip),%rax
  jmp    L459
  lea    D67(%rip),%rax
  jmp    L459
  lea    D221(%rip),%rax
  jmp    L459
  lea    D252(%rip),%rax
  jmp    L459
  lea    D405(%rip),%rax
  jmp    L459
  lea    D241(%rip),%rax
  jmp    L459
  lea    D414(%rip),%rax
  jmp    L459
  movzbl -0x8(%rbp),%eax
  cmp    $0x3,%eax
  je     L314
  cmp    $0x3,%eax
  jg     L448
  cmp    $0x2,%eax
  je     L85
  cmp    $0x2,%eax
  jg     L448
  test   %eax,%eax
  je     L175
  cmp    $0x1,%eax
  je     L449
  jmp    L448
L175:
  lea    D285(%rip),%rax
  jmp    L459
L449:
  lea    D191(%rip),%rax
  jmp    L459
L85:
  lea    D211(%rip),%rax
  jmp    L459
L314:
  lea    D263(%rip),%rax
  jmp    L459
  cmpb   $0x0,-0x8(%rbp)
  jne    L583
  lea    D186(%rip),%rax
  jmp    L459
  cmpb   $0x0,-0x8(%rbp)
  jne    L252
  lea    D254(%rip),%rax
  jmp    L459
L252:
  cmpb   $0x10,-0x8(%rbp)
  jne    L471
  lea    D22(%rip),%rax
  jmp    L459
  cmpb   $0x0,-0x8(%rbp)
  jne    L392
  lea    D63(%rip),%rax
  jmp    L459
L392:
  cmpb   $0x1,-0x8(%rbp)
  jne    L71
  lea    D127(%rip),%rax
  jmp    L459
  cmpb   $0x0,-0x8(%rbp)
  jne    L21
  lea    D9(%rip),%rax
  jmp    L459
L21:
  cmpb   $0x1,-0x8(%rbp)
  jne    L385
  lea    D89(%rip),%rax
  jmp    L459
L385:
  cmpb   $0x2,-0x8(%rbp)
  jne    L194
  lea    D62(%rip),%rax
  jmp    L459
  movzbl -0x8(%rbp),%eax
  cmp    $0x5,%eax
  ja     L315
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D277(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D277(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  lea    D220(%rip),%rax
  jmp    L459
  lea    D122(%rip),%rax
  jmp    L459
  lea    D237(%rip),%rax
  jmp    L459
  lea    D64(%rip),%rax
  jmp    L459
  lea    D171(%rip),%rax
  jmp    L459
  lea    D85(%rip),%rax
  jmp    L459
L53:
  nop
  jmp    L26
L109:
  nop
  jmp    L26
L448:
  nop
  jmp    L26
L583:
  nop
  jmp    L26
L471:
  nop
  jmp    L26
L71:
  nop
  jmp    L26
L194:
  nop
  jmp    L26
L315:
  nop
L26:
  lea    D335(%rip),%rax
L459:
  pop    %rbp
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D416
type_infered: string
name: extract_symbolic_data
arguments: data_label: D173
type_infered: string
name: extract_symbolic_data
arguments: data_label: D31
type_infered: string
name: extract_symbolic_data
arguments: data_label: D83
type_infered: string
name: extract_symbolic_data
arguments: data_label: D3
type_infered: string
name: extract_symbolic_data
arguments: data_label: D251
type_infered: string
name: extract_symbolic_data
arguments: data_label: D88
type_infered: string
name: extract_symbolic_data
arguments: data_label: D340
type_infered: string
name: extract_symbolic_data
arguments: data_label: D349
type_infered: string
name: extract_symbolic_data
arguments: data_label: D395
type_infered: string
name: extract_symbolic_data
arguments: data_label: D264
type_infered: string
name: extract_symbolic_data
arguments: data_label: D67
type_infered: string
name: extract_symbolic_data
arguments: data_label: D221
type_infered: string
name: extract_symbolic_data
arguments: data_label: D252
type_infered: string
name: extract_symbolic_data
arguments: data_label: D405
type_infered: string
name: extract_symbolic_data
arguments: data_label: D241
type_infered: string
name: extract_symbolic_data
arguments: data_label: D414
type_infered: string
name: extract_symbolic_data
arguments: data_label: D285
type_infered: string
name: extract_symbolic_data
arguments: data_label: D191
type_infered: string
name: extract_symbolic_data
arguments: data_label: D211
type_infered: string
name: extract_symbolic_data
arguments: data_label: D263
type_infered: string
name: extract_symbolic_data
arguments: data_label: D186
type_infered: string
name: extract_symbolic_data
arguments: data_label: D254
type_infered: string
name: extract_symbolic_data
arguments: data_label: D22
type_infered: string
name: extract_symbolic_data
arguments: data_label: D63
type_infered: string
name: extract_symbolic_data
arguments: data_label: D127
type_infered: string
name: extract_symbolic_data
arguments: data_label: D9
type_infered: string
name: extract_symbolic_data
arguments: data_label: D89
type_infered: string
name: extract_symbolic_data
arguments: data_label: D62
type_infered: string
name: extract_symbolic_data
arguments: data_label: D220
type_infered: string
name: extract_symbolic_data
arguments: data_label: D122
type_infered: string
name: extract_symbolic_data
arguments: data_label: D237
type_infered: string
name: extract_symbolic_data
arguments: data_label: D64
type_infered: string
name: extract_symbolic_data
arguments: data_label: D171
type_infered: string
name: extract_symbolic_data
arguments: data_label: D85
type_infered: string
name: extract_symbolic_data
arguments: data_label: D335
type_infered: string

tool: D416: No code

tool: D173: Net Unreachable

tool: D31: Host Unreachable

tool: D83: Protocol Unreachable

tool: D3: Port Unreachable

tool: D251: Fragmentation Needed and Don't Fragment was Set

tool: D88: Source Route Failed

tool: D340: Destination Network Unknown

tool: D349: Destination Host Unknown

tool: D395: Source Host Isolated

tool: D264: Communication with Destination Network is Administratively Prohibited

tool: D67: Communication with Destination Host is Administratively Prohibited

tool: D221: Destination Network Unreachable for Type of Service

tool: D252: Destination Host Unreachable for Type of Service

tool: D405: Communication Administratively Prohibited

tool: D241: Host Precedence Violation

tool: D414: Precedence cutoff in effect

tool: D285: Redirect Datagram for the Network (or subnet)

tool: D191: Redirect Datagram for the Host

tool: D211: Redirect Datagram for the Type of Service and Network

tool: D263: Redirect Datagram for the Type of Service and Host

tool: D186: Alternate Address for Host

tool: D254: Normal router advertisement

tool: D22: Does not route common traffic

tool: D63: Time to Live exceeded in Transit

tool: D127: Fragment Reassembly Time Exceeded

tool: D9: Pointer indicates the error

tool: D89: Missing a Required Option

tool: D62: Bad Length

tool: D220: Bad SPI

tool: D122: Authentication Failed

tool: D237: Decompression Failed

tool: D64: Decryption Failed

tool: D171: Need Authentication

tool: D85: Need Authorization

tool: D335: UNKNOWN

assistant: ```c
char *icmp_code(unsigned char type, unsigned char code) {
  switch (type) {
  case 0:
  case 4:
  case 8:
  case 10:
  case 13:
  case 14:
  case 15:
  case 16:
  case 17:
  case 18:
    if (code == 0)
      return ("No code");
    break;
  case 3:
    switch (code) {
    case 0:
      return ("Net Unreachable");
    case 1:
      return ("Host Unreachable");
    case 2:
      return ("Protocol Unreachable");
    case 3:
      return ("Port Unreachable");
    case 4:
      return ("Fragmentation Needed and Don't Fragment was Set");
    case 5:
      return ("Source Route Failed");
    case 6:
      return ("Destination Network Unknown");
    case 7:
      return ("Destination Host Unknown");
    case 8:
      return ("Source Host Isolated");
    case 9:
      return ("Communication with Destination Network is Administratively Prohibited");
    case 10:
      return ("Communication with Destination Host is Administratively Prohibited");
    case 11:
      return ("Destination Network Unreachable for Type of Service");
    case 12:
      return ("Destination Host Unreachable for Type of Service");
    case 13:
      return ("Communication Administratively Prohibited");
    case 14:
      return ("Host Precedence Violation");
    case 15:
      return ("Precedence cutoff in effect");
    }
    break;
  case 5:
    switch (code) {
    case 0:
      return ("Redirect Datagram for the Network (or subnet)");
    case 1:
      return ("Redirect Datagram for the Host");
    case 2:
      return ("Redirect Datagram for the Type of Service and Network");
    case 3:
      return ("Redirect Datagram for the Type of Service and Host");
    }
    break;
  case 6:
    if (code == 0)
      return ("Alternate Address for Host");
    break;
  case 9:
    if (code == 0)
      return ("Normal router advertisement");
    if (code == 16)
      return ("Does not route common traffic");
    break;
  case 11:
    if (code == 0)
      return ("Time to Live exceeded in Transit");
    if (code == 1)
      return ("Fragment Reassembly Time Exceeded");
    break;
  case 12:
    if (code == 0)
      return ("Pointer indicates the error");
    if (code == 1)
      return ("Missing a Required Option");
    if (code == 2)
      return ("Bad Length");
    break;
  case 40:
    switch (code) {
    case 0:
      return ("Bad SPI");
    case 1:
      return ("Authentication Failed");
    case 2:
      return ("Decompression Failed");
    case 3:
      return ("Decryption Failed");
    case 4:
      return ("Need Authentication");
    case 5:
      return ("Need Authorization");
    }
    break;
  }
  return ("UNKNOWN");
}
```