ForumAssembler-Code von X86 nach PPC konvertieren
GoaSkin – Donnerstag, 20. Dezember 2007 17:38 Uhr

Nein, ich möchte kein Programm auf eine andere Plattform portieren.

Ich habe hier ein Linux-Spiel, das es normalerweise nur für die Intel-Plattform gibt, jedoch der Hersteller zu reinen Experimentierzwecken eine PPC-Version des Programmes herausgegeben hat, die aber eigentlich ganz gut funktioniert.
Nur: Nachdem das PPC-Programm (ohne Support!) schon rausgegeben war, ist dem Hersteller ein kleiner Bug aufgefallen, für den er einen Patch herausgegeben hat – natürlich nur für die Intel-Version, sodaß Mac-Nutzer mit dem Bug leben müssen.

Mit den binutils habe ich die gepatchte und die ungepatchte Version verglichen und dabei festgestellt, daß es sich nur um zwei Funktionen handelt, die da verändert wurden. Diese wiederrum nur sehr minimal. Also sollte es eigentlich kein großes Thema sein, in das PPC-Binary äquivalente PPC- Assembler-Funktionen zu implementieren.

Damit hier bei die Arbeit etwas leichter von statten gehen kann wollte ich einmal nachfragen, ob jemand ein Tool kennt, das zu eingegebenem X86-Assembler Code wirkungsgleichen Code für andere Architekturen ausgibt.

1 Antwort
Dieter Drewanz – Sonntag, 30. Dezember 2007 20:23 Uhr

Das ist eine interessante Frage, die vor langer Zeit (8080 und 6502 Zeiten) auch einmal hatte. Der Maschinencode ist Prozessorabhängig und die Architektur der Prozessoren ist von der Art der Register einfach zu unterschiedlich. Wenn der Maschinencode vorliegt (die Bytes herausgepoked) kann der Code nicht portiert werden. Zu der Zeit begann aber eine Fortentwicklung der Assembler, d.h. es wurde eine Abstraktionsebene eigenführt mit Bezeichnungen/Variablen. Damit konnte erstmals Maschinencode in gewissen Grenzen portierbar geschrieben werden. Das noch am einfachsten begreifbare Beispiel ist der Umgang mit zwei und vier Registern. Wenn das Programm mit vier Registern arbeitete, der andere Prozessor aber nur zwei Register hatte, dann wurden für die anderen Register Speicherzellen im Hauptspeicher zugeordnet und dazwischen die Werte hin und her geschoben. Der Code in Bytes für den Rechner wird dadurch länger. Später hat man gleiche Funktionen für verschiedene Rechnerarchitekturen modularisiert. Diese Bausteine verwendet z.B. ein C++ Compiler bei der Übersetzung und baut daraus den Code zusammen für die verschiedenen Architekturen. Somit müßtest Du einen Sourcecode auf einer höheren Abstraktionsebene besitzten, um den Patch auf die andere Architektur zu übertragen. Bei einem Dreizeilerprogramm hatte ich mir mal die gänderten Bytes bei > und >= (Integer) Vergleich mal herausgefischt und mit peek/poke dann manuell geändert (hier gab es noch keine Verschiebung, d.h. der Code der Funktion wurde nicht länger oder kürzer, sonst gibt es ein Problem mit den absoluten/relativen Sprungadressen). Somit müßte man über “reverse engineering” den Sourcecode in C zu generieren.
Wenn der Fehler im Sourcecode (C,C++ oder andere höhere Programmiersprache) war, ist es eigenlich schade, daß der Hersteller nicht nochmal seinen Compiler für die MAC Ausgabe anwirft.