Solution simple:
Une approche commune consiste à ajouter l'assemblage en ligne et à coder directement les octets d'instruction.
Par exemple:
int main()
{
asm __volatile__ (".byte 0x90\n");
return 0;
}
compile (gcc -o3) dans:
00000000004005a0 <main>:
4005a0: 90 nop
4005a1: 31 c0 xor %eax,%eax
4005a3: c3 retq
Remplacez donc simplement 0x90 par vos octets Inst. Bien sûr, vous ne verrez pas les instructions réelles sur un objdump ordinaire, et le programme ne fonctionnerait probablement pas sur votre système (sauf si vous utilisez l'une des combinaisons NOP), mais le simulateur doit le reconnaître s'il y est correctement implémenté.
Notez que vous ne pouvez pas vous attendre à ce que le compilateur vous optimise bien pour vous lorsqu'il ne connaît pas cette instruction, et vous devez prendre soin et travailler avec des options de cloche / entrée / sortie / sortie en ligne si elle modifie l'état (registres, mémoire), pour assurer l'exactitude. Utilisez des optimisations uniquement si vous le devez.
Solution compliquée
L'approche alternative consiste à implémenter cela dans votre compilateur - cela peut être fait dans GCC, mais comme indiqué dans les commentaires, LLVM est probablement l'un des meilleurs à jouer, car il est conçu comme une plate-forme de développement de compilateur, mais il est toujours très compliqué Comme LLVM est le mieux adapté aux étapes d'optimisation IR, et est un peu moins convivial lorsque vous essayez de modifier les backends spécifiques à la cible.
Pourtant, c'est faisable et vous devez le faire si vous prévoyez également que votre compilateur décide quand émettre cette instruction. Je suggérerais de commencer la première option pour voir si votre simulateur fonctionne même avec cet ajout, et alors seulement passer du temps du côté du compilateur.
Si et quand vous décidez de l'implémenter dans LLVM, votre meilleur pari est de le définir comme une fonction intrinsèque, il y a relativement plus de documentation à ce sujet ici - http://llvm.org/docs/extendingllvm.html