Gibt es einen universellen Assembler?
Gibt es so etwas wie einen „Multi-Architektur“-Assembler, der eine weitgehend einheitliche Syntax verwendet und dabei unterschiedliche Architekturen unterstützt?
Dass sich der Befehlssatz und zulässige Adressierungsarten zwischen verschiedenen Prozessoren unterscheiden, ist natürlich klar, aber solch einen Unsinn wie verschiedene Mnemonics, die im Prinzip genau dasselbe bewirken (z.B. „sec“ vs. „stc“ für „set carry“ oder „eor“ vs. „xor“ für „exklusiv-oder“ oder „pop“ vs. „pull“, um einen Wert vom Stack zu holen) könnte man doch beseitigen und jeweils eine Variante festlegen, die dann für alle Architekturen gilt (sofern dies Teil ihres Befehlssatzes ist).
Ebenso könnte man festlegen, ob die Mnemonics selbst Informationen über die Addressierungsart, die Breite der Operanden etc. enthalten (als „Suffix“) oder ob sich dies aus der jeweiligen Schreibweise der Operanden ergeben soll (und ggf. „Dummy“-Operanden verwendet werden) und dies dann ebenfalls für alle Architekturen einheitlich machen.
Gibt es so etwas schon und wenn ja, wo?
2 Antworten
Das ist nichts anderes als Assembler-Pseudocode. Sobald der Adressbereich geeignet definiert ist kann man so etwas problemlos so konstruieren, dass es im Grenzfall (unendlicher Speicher) der
https://de.wikipedia.org/wiki/Church-Turing-These
genügt.
Das ist im Prinzip jede Programmiersprache denn am Ende wird alles in Maschinencode umgewandelt.
In „jeder“ Programmiersprache kann man aber nicht direkt auf Prozessorregister zugreifen, Flags setzen, löschen oder abfragen (z.B. Interrupts ein-/ausschalten) oder andere „lustige“ Architektur-spezifische Dinge (wie beim x86 vom Real Mode in den Protected Mode umzuschalten), ohne dazu zumindest ein wenig Inline-Assembler zu nutzen.
Es geht ja nur um eine einheitliche Syntax und nicht darum, dass exakt der gleiche Code, der all die Eigenarten des jeweiligen Prozessors nutzt, sich für andere Architekturen assemblieren/compilieren lassen (und darauf laufen) soll.