user: Demonstrate the C code that generates the assembly output below:

```asm
<EthProto2Str>:
  endbr64
  push   %rbx
  mov    %rsi,%rbx
  mov    %edi,%eax
  sar    $0x10,%eax
  cmp    $0x90,%al
  ja     L297
  movzbl %al,%edx
  mov    %edx,%edx
  lea    D304(%rip),%rcx
  movslq (%rcx,%rdx,4),%rax
  add    %rcx,%rax
  notrack jmp *%rax
  lea    D54(%rip),%rax
  jmp    L226
  lea    D36(%rip),%rax
L226:
  pop    %rbx
  ret
  lea    D35(%rip),%rax
  jmp    L226
  lea    D123(%rip),%rax
  jmp    L226
  lea    D133(%rip),%rax
  jmp    L226
  lea    D201(%rip),%rax
  jmp    L226
  lea    D288(%rip),%rax
  jmp    L226
  lea    D14(%rip),%rax
  jmp    L226
  lea    D343(%rip),%rax
  jmp    L226
  lea    D204(%rip),%rax
  jmp    L226
  lea    D255(%rip),%rax
  jmp    L226
  lea    D184(%rip),%rax
  jmp    L226
  lea    D126(%rip),%rax
  jmp    L226
  lea    D94(%rip),%rax
  jmp    L226
  lea    D108(%rip),%rax
  jmp    L226
  lea    D270(%rip),%rax
  jmp    L226
  lea    D170(%rip),%rax
  jmp    L226
  lea    D228(%rip),%rax
  jmp    L226
  lea    D8(%rip),%rax
  jmp    L226
  lea    D131(%rip),%rax
  jmp    L226
  lea    D285(%rip),%rax
  jmp    L226
  lea    D133(%rip),%rax
  jmp    L226
  lea    D174(%rip),%rax
  jmp    L226
  lea    D212(%rip),%rax
  jmp    L226
  lea    D319(%rip),%rax
  jmp    L226
  lea    D171(%rip),%rax
  jmp    L226
L297:
  movzwl %di,%eax
  add    $0xffffff80,%eax
  cmp    $0x5,%eax
  ja     L80
  mov    %eax,%eax
  lea    D18(%rip),%rdx
  movslq (%rdx,%rax,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  lea    D164(%rip),%rax
  jmp    L226
  lea    D336(%rip),%rax
  jmp    L226
  lea    D208(%rip),%rax
  jmp    L226
  lea    D114(%rip),%rax
  jmp    L226
  lea    D183(%rip),%rax
  jmp    L226
L80:
  mov    %edi,%edx
  lea    D191(%rip),%rsi
  mov    %rbx,%rdi
  call   <sprintf@plt>
  mov    %rbx,%rax
  jmp    L226
  lea    D260(%rip),%rax
  jmp    L226
  lea    D166(%rip),%rax
  jmp    L226
```

tool_calls: name: disassemble_data
arguments: label: D54
type_infered: string
name: disassemble_data
arguments: label: D36
type_infered: string
name: disassemble_data
arguments: label: D35
type_infered: string
name: disassemble_data
arguments: label: D123
type_infered: string
name: disassemble_data
arguments: label: D133
type_infered: string
name: disassemble_data
arguments: label: D201
type_infered: string
name: disassemble_data
arguments: label: D288
type_infered: string
name: disassemble_data
arguments: label: D14
type_infered: string
name: disassemble_data
arguments: label: D343
type_infered: string
name: disassemble_data
arguments: label: D204
type_infered: string
name: disassemble_data
arguments: label: D255
type_infered: string
name: disassemble_data
arguments: label: D184
type_infered: string
name: disassemble_data
arguments: label: D126
type_infered: string
name: disassemble_data
arguments: label: D94
type_infered: string
name: disassemble_data
arguments: label: D108
type_infered: string
name: disassemble_data
arguments: label: D270
type_infered: string
name: disassemble_data
arguments: label: D170
type_infered: string
name: disassemble_data
arguments: label: D228
type_infered: string
name: disassemble_data
arguments: label: D8
type_infered: string
name: disassemble_data
arguments: label: D131
type_infered: string
name: disassemble_data
arguments: label: D285
type_infered: string
name: disassemble_data
arguments: label: D174
type_infered: string
name: disassemble_data
arguments: label: D212
type_infered: string
name: disassemble_data
arguments: label: D319
type_infered: string
name: disassemble_data
arguments: label: D171
type_infered: string
name: disassemble_data
arguments: label: D164
type_infered: string
name: disassemble_data
arguments: label: D336
type_infered: string
name: disassemble_data
arguments: label: D208
type_infered: string
name: disassemble_data
arguments: label: D114
type_infered: string
name: disassemble_data
arguments: label: D183
type_infered: string
name: disassemble_data
arguments: label: D191
type_infered: string
name: disassemble_data
arguments: label: D260
type_infered: string
name: disassemble_data
arguments: label: D166
type_infered: string

tool: D54: FTPCMD

tool: D36: SSH

tool: D35: TELNET

tool: D123: SMTP

tool: D133: DNS

tool: D201: BOOTPS

tool: D288: BOOTPC

tool: D14: HTTP

tool: D343: POP3

tool: D204: RPC

tool: D255: SFTP

tool: D184: NTP

tool: D126: NETBIOSNS

tool: D94: NETBIOSDGM

tool: D108: NETBIOSSSN

tool: D270: SNMP

tool: D170: BGP

tool: D228: IRC

tool: D8: IMAP3

tool: D131: HTTPS

tool: D285: VNC

tool: D174: QUIC

tool: D212: TFTP

tool: D319: UDP

tool: D171: TCP

tool: D164: IPv6

tool: D336: ARP

tool: D208: RARP

tool: D114: PPPOE_Discover

tool: D183: PPPOE_SESSION

tool: D191: 0x%4x

tool: D260: FTPDATA

tool: D166: IP

assistant: ```c
const char *EthProto2Str(uint32_t proto, char *cache) {
  uint16_t ipflag = (proto >> 16) & 0xff;
  uint16_t ethproto = proto & 0xffff;
  switch (ipflag) {
  case (0x40 + 1):
    return "FTPDATA";
    ;
  case (0x40 + 2):
    return "FTPCMD";
    ;
  case (0x40 + 3):
    return "SSH";
    ;
  case (0x40 + 4):
    return "TELNET";
    ;
  case (0x40 + 5):
    return "SMTP";
    ;
  case (0x40 + 10):
    return "DNS";
    ;
  case (0x40 + 11):
    return "BOOTPS";
    ;
  case (0x40 + 12):
    return "BOOTPC";
    ;
  case (0x40 + 20):
    return "HTTP";
    ;
  case (0x40 + 21):
    return "POP3";
    ;
  case (0x40 + 22):
    return "RPC";
    ;
  case (0x40 + 23):
    return "SFTP";
    ;
  case (0x40 + 24):
    return "NTP";
    ;
  case (0x40 + 25):
    return "NETBIOSNS";
    ;
  case (0x40 + 26):
    return "NETBIOSDGM";
    ;
  case (0x40 + 27):
    return "NETBIOSSSN";
    ;
  case (0x40 + 30):
    return "SNMP";
    ;
  case (0x40 + 35):
    return "BGP";
    ;
  case (0x40 + 36):
    return "IRC";
    ;
  case (0x40 + 37):
    return "IMAP3";
    ;
  case (0x40 + 38):
    return "HTTPS";
    ;
  case (0x40 + 80):
    return "VNC";
    ;
  case (0x0 + 11):
    return "DNS";
  case (0x0 + 12):
    return "QUIC";
  case (0x0 + 10):
    return "TFTP";
  case (0x0 + 1):
    return "UDP";
  case (0x40):
    return "TCP";
  default:
    break;
  }
  switch (ethproto) {
  case ETH_P_IP:
    return "IP";
  case ETH_P_IPV6:
    return "IPv6";
  case ETH_P_ARP:
    return "ARP";
  case ETH_P_RARP:
    return "RARP";
  case ETH_P_PPP_DISC:
    return "PPPOE_Discover";
  case ETH_P_PPP_SES:
    return "PPPOE_SESSION";
  default:
    sprintf(cache, "0x%4x", proto);
    break;
  }
  return cache;
}
```