user: 请将以下的汇编代码转换成C语言代码：

```asm
<mnemonic>:
  endbr64
  sub    $0x30,%esi
  mov    %rdi,%r8
  mov    %edx,%eax
  cmp    $0x16,%sil
  ja     L25
  lea    D257(%rip),%rdi
  movzbl %sil,%esi
  movslq (%rdi,%rsi,4),%rdx
  add    %rdi,%rdx
  notrack jmp *%rdx
  nopw   0x0(%rax,%rax,1)
  lea    -0x30(%rax),%edx
  cmp    $0x16,%dl
  jbe    L27
L25:
  movabs $0x4f52524520212121,%rax
  movl   $0x21212052,0x8(%r8)
  mov    %rax,(%r8)
  mov    $0x21,%eax
  mov    %ax,0xc(%r8)
  ret
  nopl   0x0(%rax)
  movsbl %al,%edx
  movsbl %cl,%ecx
  lea    D39(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  nopw   0x0(%rax,%rax,1)
  movsbl %al,%edx
  movsbl %cl,%ecx
  lea    D94(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  nopw   0x0(%rax,%rax,1)
  movsbl %al,%edx
  movsbl %cl,%ecx
  lea    D74(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  nopw   0x0(%rax,%rax,1)
  movsbl %al,%edx
  movsbl %cl,%ecx
  lea    D127(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  nopw   0x0(%rax,%rax,1)
  movsbl %al,%edx
  movsbl %cl,%ecx
  lea    D90(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  nopw   0x0(%rax,%rax,1)
  movsbl %al,%edx
  movsbl %cl,%ecx
  lea    D144(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  nopw   0x0(%rax,%rax,1)
  movsbl %al,%edx
  movsbl %cl,%ecx
  lea    D65(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  nopw   0x0(%rax,%rax,1)
  movsbl %al,%edx
  movsbl %cl,%ecx
  lea    D243(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  nopw   0x0(%rax,%rax,1)
  movsbl %al,%edx
  movsbl %cl,%ecx
  lea    D64(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  nopw   0x0(%rax,%rax,1)
  movsbl %al,%edx
  movsbl %cl,%ecx
  lea    D178(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  nopw   0x0(%rax,%rax,1)
  movsbl %al,%edx
  movsbl %cl,%ecx
  lea    D261(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  nopw   0x0(%rax,%rax,1)
  movsbl %al,%edx
  movsbl %cl,%ecx
  lea    D157(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  nopw   0x0(%rax,%rax,1)
  movsbl %al,%edx
  movsbl %cl,%ecx
  lea    D142(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  nopw   0x0(%rax,%rax,1)
  movsbl %al,%edx
  movsbl %cl,%ecx
  lea    D176(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  nopw   0x0(%rax,%rax,1)
  movsbl %al,%edx
  movsbl %cl,%ecx
  lea    D217(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  nopw   0x0(%rax,%rax,1)
L27:
  lea    D105(%rip),%rsi
  movzbl %dl,%edx
  movslq (%rsi,%rdx,4),%rdx
  add    %rsi,%rdx
  notrack jmp *%rdx
  nopl   0x0(%rax)
  movsbl %al,%edx
  movsbl %cl,%ecx
  lea    D275(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  sub    $0x30,%ecx
  cmp    $0x16,%cl
  ja     L25
  lea    D27(%rip),%rdx
  movzbl %cl,%ecx
  movslq (%rdx,%rcx,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  movsbl %cl,%edx
  lea    D179(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  movsbl %cl,%edx
  lea    D81(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  movsbl %cl,%edx
  lea    D82(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  movsbl %cl,%edx
  lea    D288(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  movsbl %cl,%edx
  lea    D287(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  movsbl %cl,%edx
  lea    D256(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  movsbl %cl,%edx
  lea    D96(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  movsbl %cl,%edx
  lea    D20(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  movsbl %cl,%edx
  lea    D95(%rip),%rsi
  mov    %r8,%rdi
  xor    %eax,%eax
  jmp    1050 <sprintf@plt>
  movl   $0x41525845,(%r8)
  movb   $0x0,0x4(%r8)
  ret
  movl   $0x4d525845,(%r8)
  movb   $0x0,0x4(%r8)
  ret
  movl   $0x4c525845,(%r8)
  movb   $0x0,0x4(%r8)
  ret
  movl   $0x564944,(%r8)
  ret
  movl   $0x544c554d,(%r8)
  movb   $0x0,0x4(%r8)
  ret
  movl   $0x435352,(%r8)
  ret
  movl   $0x435453,(%r8)
  ret
  movl   $0x41454c43,(%r8)
  movw   $0x52,0x4(%r8)
  ret
  movl   $0x544552,(%r8)
  ret
  movl   $0x454d4954,(%r8)
  movb   $0x0,0x4(%r8)
  ret
  movl   $0x444e52,(%r8)
  ret
  movl   $0x58485a44,(%r8)
  movb   $0x0,0x4(%r8)
  ret
  movl   $0x5a445848,(%r8)
  movb   $0x0,0x4(%r8)
  ret
  lea    D135(%rip),%rsi
  mov    $0x7,%ecx
  mov    %r8,%rdi
  rep movsb %ds:(%rsi),%es:(%rdi)
  ret
  movl   $0x504f4e,(%r8)
  ret
  movl   $0x544c4148,(%r8)
  movb   $0x0,0x4(%r8)
  ret
```

tool_calls: name: parse_data
arguments: label: D39
type: string
name: parse_data
arguments: label: D94
type: string
name: parse_data
arguments: label: D74
type: string
name: parse_data
arguments: label: D127
type: string
name: parse_data
arguments: label: D90
type: string
name: parse_data
arguments: label: D144
type: string
name: parse_data
arguments: label: D65
type: string
name: parse_data
arguments: label: D243
type: string
name: parse_data
arguments: label: D64
type: string
name: parse_data
arguments: label: D178
type: string
name: parse_data
arguments: label: D261
type: string
name: parse_data
arguments: label: D157
type: string
name: parse_data
arguments: label: D142
type: string
name: parse_data
arguments: label: D176
type: string
name: parse_data
arguments: label: D217
type: string
name: parse_data
arguments: label: D275
type: string
name: parse_data
arguments: label: D179
type: string
name: parse_data
arguments: label: D81
type: string
name: parse_data
arguments: label: D82
type: string
name: parse_data
arguments: label: D288
type: string
name: parse_data
arguments: label: D287
type: string
name: parse_data
arguments: label: D256
type: string
name: parse_data
arguments: label: D96
type: string
name: parse_data
arguments: label: D20
type: string
name: parse_data
arguments: label: D95
type: string
name: parse_data
arguments: label: D135
type: string

tool: D39: MOV  %c,%c

tool: D94: MOVI %c,%c

tool: D74: AND  %c,%c

tool: D127: ANDI %c,%c

tool: D90: ADD  %c,%c

tool: D144: ADDI %c,%c

tool: D65: SUB  %c,%c

tool: D243: SUBI %c,%c

tool: D64: CMP  %c,%c

tool: D178: CMPI %c,%c

tool: D261: OR   %c,%c

tool: D157: CALL %c%c

tool: D142: GOTO %c%c

tool: D176: BRC  %c%c

tool: D217: BRZ  %c%c

tool: D275: DISP %c,%c

tool: D179: KIN  %c

tool: D81: DOT  %c

tool: D82: DIN  %c

tool: D288: SUBC %c

tool: D287: ADC  %c

tool: D256: SHL  %c

tool: D96: SHR  %c

tool: D20: INV  %c

tool: D95: MAS  %c

tool: D135: DISOUT

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 !!!");
  }
  }
}
```