user: What is the c source code of the assembly code below?

```asm
<mnemonic>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x8(%rbp)
  mov    %ecx,%eax
  mov    %esi,%ecx
  mov    %cl,-0xc(%rbp)
  mov    %dl,-0x10(%rbp)
  mov    %al,-0x14(%rbp)
  movsbl -0xc(%rbp),%eax
  sub    $0x30,%eax
  cmp    $0x16,%eax
  ja     L140
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D154(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D154(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  movsbl -0x14(%rbp),%ecx
  movsbl -0x10(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D296(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L164
  movsbl -0x14(%rbp),%ecx
  movsbl -0x10(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D9(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L164
  movsbl -0x14(%rbp),%ecx
  movsbl -0x10(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D84(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L164
  movsbl -0x14(%rbp),%ecx
  movsbl -0x10(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D291(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L164
  movsbl -0x14(%rbp),%ecx
  movsbl -0x10(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D151(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L164
  movsbl -0x14(%rbp),%ecx
  movsbl -0x10(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D396(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L164
  movsbl -0x14(%rbp),%ecx
  movsbl -0x10(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D38(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L164
  movsbl -0x14(%rbp),%ecx
  movsbl -0x10(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D183(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L164
  movsbl -0x14(%rbp),%ecx
  movsbl -0x10(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D172(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L164
  movsbl -0x14(%rbp),%ecx
  movsbl -0x10(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D123(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L164
  movsbl -0x14(%rbp),%ecx
  movsbl -0x10(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D115(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L164
  movsbl -0x14(%rbp),%ecx
  movsbl -0x10(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D480(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L164
  movsbl -0x14(%rbp),%ecx
  movsbl -0x10(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D336(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L164
  movsbl -0x14(%rbp),%ecx
  movsbl -0x10(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D204(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L164
  movsbl -0x14(%rbp),%ecx
  movsbl -0x10(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D179(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L164
  movsbl -0x10(%rbp),%eax
  sub    $0x30,%eax
  cmp    $0x16,%eax
  ja     L173
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D494(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D494(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  movsbl -0x14(%rbp),%eax
  sub    $0x30,%eax
  cmp    $0x16,%eax
  ja     L383
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D281(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D281(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    -0x8(%rbp),%rax
  lea    D356(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L367
  mov    -0x8(%rbp),%rax
  lea    D340(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L367
  mov    -0x8(%rbp),%rax
  lea    D354(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L367
  mov    -0x8(%rbp),%rax
  lea    D114(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L367
  mov    -0x8(%rbp),%rax
  lea    D118(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L367
  mov    -0x8(%rbp),%rax
  lea    D10(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L367
  mov    -0x8(%rbp),%rax
  lea    D181(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L367
  mov    -0x8(%rbp),%rax
  lea    D35(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L367
  mov    -0x8(%rbp),%rax
  lea    D226(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L367
  mov    -0x8(%rbp),%rax
  lea    D72(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L367
  mov    -0x8(%rbp),%rax
  lea    D285(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L367
  mov    -0x8(%rbp),%rax
  lea    D30(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L367
  mov    -0x8(%rbp),%rax
  lea    D333(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L367
  mov    -0x8(%rbp),%rax
  lea    D464(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L367
  mov    -0x8(%rbp),%rax
  lea    D352(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L367
  mov    -0x8(%rbp),%rax
  lea    D495(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L367
L383:
  mov    -0x8(%rbp),%rax
  lea    D492(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L278
L367:
  jmp    L278
  movsbl -0x14(%rbp),%ecx
  movsbl -0x10(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D167(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L278
  movsbl -0x14(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D80(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L278
  movsbl -0x14(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D188(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L278
  movsbl -0x14(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D359(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L278
  movsbl -0x14(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D283(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L278
  movsbl -0x14(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D242(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L278
  movsbl -0x14(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D202(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L278
  movsbl -0x14(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D248(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L278
  movsbl -0x14(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D215(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L278
  movsbl -0x14(%rbp),%edx
  mov    -0x8(%rbp),%rax
  lea    D177(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L278
L173:
  mov    -0x8(%rbp),%rax
  lea    D492(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  jmp    L164
L278:
  jmp    L164
L140:
  mov    -0x8(%rbp),%rax
  lea    D492(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  nop
L164:
  nop
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_label: D296
type: string
name: disassemble_data
arguments: data_label: D9
type: string
name: disassemble_data
arguments: data_label: D84
type: string
name: disassemble_data
arguments: data_label: D291
type: string
name: disassemble_data
arguments: data_label: D151
type: string
name: disassemble_data
arguments: data_label: D396
type: string
name: disassemble_data
arguments: data_label: D38
type: string
name: disassemble_data
arguments: data_label: D183
type: string
name: disassemble_data
arguments: data_label: D172
type: string
name: disassemble_data
arguments: data_label: D123
type: string
name: disassemble_data
arguments: data_label: D115
type: string
name: disassemble_data
arguments: data_label: D480
type: string
name: disassemble_data
arguments: data_label: D336
type: string
name: disassemble_data
arguments: data_label: D204
type: string
name: disassemble_data
arguments: data_label: D179
type: string
name: disassemble_data
arguments: data_label: D356
type: string
name: disassemble_data
arguments: data_label: D340
type: string
name: disassemble_data
arguments: data_label: D354
type: string
name: disassemble_data
arguments: data_label: D114
type: string
name: disassemble_data
arguments: data_label: D118
type: string
name: disassemble_data
arguments: data_label: D10
type: string
name: disassemble_data
arguments: data_label: D181
type: string
name: disassemble_data
arguments: data_label: D35
type: string
name: disassemble_data
arguments: data_label: D226
type: string
name: disassemble_data
arguments: data_label: D72
type: string
name: disassemble_data
arguments: data_label: D285
type: string
name: disassemble_data
arguments: data_label: D30
type: string
name: disassemble_data
arguments: data_label: D333
type: string
name: disassemble_data
arguments: data_label: D464
type: string
name: disassemble_data
arguments: data_label: D352
type: string
name: disassemble_data
arguments: data_label: D495
type: string
name: disassemble_data
arguments: data_label: D492
type: string
name: disassemble_data
arguments: data_label: D167
type: string
name: disassemble_data
arguments: data_label: D80
type: string
name: disassemble_data
arguments: data_label: D188
type: string
name: disassemble_data
arguments: data_label: D359
type: string
name: disassemble_data
arguments: data_label: D283
type: string
name: disassemble_data
arguments: data_label: D242
type: string
name: disassemble_data
arguments: data_label: D202
type: string
name: disassemble_data
arguments: data_label: D248
type: string
name: disassemble_data
arguments: data_label: D215
type: string
name: disassemble_data
arguments: data_label: D177
type: string

tool: D296: MOV  %c,%c

tool: D9: MOVI %c,%c

tool: D84: AND  %c,%c

tool: D291: ANDI %c,%c

tool: D151: ADD  %c,%c

tool: D396: ADDI %c,%c

tool: D38: SUB  %c,%c

tool: D183: SUBI %c,%c

tool: D172: CMP  %c,%c

tool: D123: CMPI %c,%c

tool: D115: OR   %c,%c

tool: D480: CALL %c%c

tool: D336: GOTO %c%c

tool: D204: BRC  %c%c

tool: D179: BRZ  %c%c

tool: D356: HALT

tool: D340: NOP

tool: D354: DISOUT

tool: D114: HXDZ

tool: D118: DZHX

tool: D10: RND

tool: D181: TIME

tool: D35: RET

tool: D226: CLEAR

tool: D72: STC

tool: D285: RSC

tool: D30: MULT

tool: D333: DIV

tool: D464: EXRL

tool: D352: EXRM

tool: D495: EXRA

tool: D492: !!! ERROR !!!

tool: D167: DISP %c,%c

tool: D80: MAS  %c

tool: D188: INV  %c

tool: D359: SHR  %c

tool: D283: SHL  %c

tool: D242: ADC  %c

tool: D202: SUBC %c

tool: D248: DIN  %c

tool: D215: DOT  %c

tool: D177: KIN  %c

assistant: ```c
void mnemonic(char *M, char c1, char c2, char c3) {
  switch (c1) {
  case '0': {
    sprintf(M, "MOV  %c,%c", c2, c3);
    break;
  }
  case '1': {
    sprintf(M, "MOVI %c,%c", c2, c3);
    break;
  }
  case '2': {
    sprintf(M, "AND  %c,%c", c2, c3);
    break;
  }
  case '3': {
    sprintf(M, "ANDI %c,%c", c2, c3);
    break;
  }
  case '4': {
    sprintf(M, "ADD  %c,%c", c2, c3);
    break;
  }
  case '5': {
    sprintf(M, "ADDI %c,%c", c2, c3);
    break;
  }
  case '6': {
    sprintf(M, "SUB  %c,%c", c2, c3);
    break;
  }
  case '7': {
    sprintf(M, "SUBI %c,%c", c2, c3);
    break;
  }
  case '8': {
    sprintf(M, "CMP  %c,%c", c2, c3);
    break;
  }
  case '9': {
    sprintf(M, "CMPI %c,%c", c2, c3);
    break;
  }
  case 'A': {
    sprintf(M, "OR   %c,%c", c2, c3);
    break;
  }
  case 'B': {
    sprintf(M, "CALL %c%c", c2, c3);
    break;
  }
  case 'C': {
    sprintf(M, "GOTO %c%c", c2, c3);
    break;
  }
  case 'D': {
    sprintf(M, "BRC  %c%c", c2, c3);
    break;
  }
  case 'E': {
    sprintf(M, "BRZ  %c%c", c2, c3);
    break;
  }
  case 'F': {
    switch (c2) {
    case '0': {
      switch (c3) {
      case '0': {
        sprintf(M, "HALT");
        break;
      }
      case '1': {
        sprintf(M, "NOP");
        break;
      }
      case '2': {
        sprintf(M, "DISOUT");
        break;
      }
      case '3': {
        sprintf(M, "HXDZ");
        break;
      }
      case '4': {
        sprintf(M, "DZHX");
        break;
      }
      case '5': {
        sprintf(M, "RND");
        break;
      }
      case '6': {
        sprintf(M, "TIME");
        break;
      }
      case '7': {
        sprintf(M, "RET");
        break;
      }
      case '8': {
        sprintf(M, "CLEAR");
        break;
      }
      case '9': {
        sprintf(M, "STC");
        break;
      }
      case 'A': {
        sprintf(M, "RSC");
        break;
      }
      case 'B': {
        sprintf(M, "MULT");
        break;
      }
      case 'C': {
        sprintf(M, "DIV");
        break;
      }
      case 'D': {
        sprintf(M, "EXRL");
        break;
      }
      case 'E': {
        sprintf(M, "EXRM");
        break;
      }
      case 'F': {
        sprintf(M, "EXRA");
        break;
      }
      default: {
        sprintf(M, "!!! ERROR !!!");
      }
      }
      break;
    }
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6': {
      sprintf(M, "DISP %c,%c", c2, c3);
      break;
    }
    case '7': {
      sprintf(M, "MAS  %c", c3);
      break;
    }
    case '8': {
      sprintf(M, "INV  %c", c3);
      break;
    }
    case '9': {
      sprintf(M, "SHR  %c", c3);
      break;
    }
    case 'A': {
      sprintf(M, "SHL  %c", c3);
      break;
    }
    case 'B': {
      sprintf(M, "ADC  %c", c3);
      break;
    }
    case 'C': {
      sprintf(M, "SUBC %c", c3);
      break;
    }
    case 'D': {
      sprintf(M, "DIN  %c", c3);
      break;
    }
    case 'E': {
      sprintf(M, "DOT  %c", c3);
      break;
    }
    case 'F': {
      sprintf(M, "KIN  %c", c3);
      break;
    }
    default: {
      sprintf(M, "!!! ERROR !!!");
    }
    }
    break;
  }
  default: {
    sprintf(M, "!!! ERROR !!!");
  }
  }
}
```