Einfache Lösung:
Ein allgemeiner Ansatz besteht darin, Inline -Montage hinzuzufügen und die Anweisungsbytes direkt zu codieren.
Zum Beispiel:
int main()
{
asm __volatile__ (".byte 0x90\n");
return 0;
}
kompiliert (gcc -o3) in:
00000000004005a0 <main>:
4005a0: 90 nop
4005a1: 31 c0 xor %eax,%eax
4005a3: c3 retq
Ersetzen Sie also einfach 0x90 durch Ihre Instytes. Natürlich werden Sie den tatsächlichen Anweisungen in einem regulären Objdumper nicht sehen, und das Programm würde wahrscheinlich nicht in Ihrem System ausgeführt werden (es sei denn, Sie verwenden eine der NOP -Kombinationen), aber der Simulator sollte sie erkennen, wenn er dort ordnungsgemäß implementiert ist.
Beachten Sie, dass Sie nicht erwarten können, dass der Compiler für Sie gut optimiert wird, wenn er diese Anweisung nicht kennt, und Sie sollten sich aufpassen und mit Inline -Assembly -Clobber-/Eingangs-/Ausgabemöglichkeiten arbeiten, wenn er den Status (Register, Speicher) zu ändert, an zu kündigen Gewährleistung der Richtigkeit. Verwenden Sie Optimierungen nur, wenn Sie müssen.
Komplizierte Lösung
Der alternative Ansatz besteht darin, dies in Ihrem Compiler zu implementieren - er kann in GCC durchgeführt werden, aber wie in den Kommentaren angegeben, ist LLVM wahrscheinlich eine der besten, mit Da LLVM am besten für IR-Optimierungsphasen geeignet ist und etwas weniger freundlich ist, wenn versucht wird, die Ziel-spezifischen Backends zu ändern.
Trotzdem ist es machbar und Sie müssen dies tun, wenn Sie auch planen, dass Ihr Compiler entscheidet, wann Sie diese Anweisung ausstellen sollen. Ich würde jedoch vorschlagen, die erste Option zu starten, um festzustellen, ob Ihr Simulator überhaupt mit dieser Ergänzung funktioniert und nur Zeit auf der Compiler -Seite verbringt.
Wenn Sie sich für die Implementierung in LLVM entscheiden, ist es am besten, sie als intrinsische Funktion zu definieren, es gibt hier relativ mehr Dokumentation dazu - http://llvm.org/docs/extendllvm.html