Kann jeder Code in einer kompilierten Sprache Zeile für Zeile bis auf die einzelnen Bits jedes CPU-Befehls im Binärformat zurückverfolgt werden?

Kann jeder Code in einer kompilierten Sprache Zeile für Zeile bis auf die einzelnen Bits jedes CPU-Befehls im Binärformat zurückverfolgt werden?

Mir ist klar, dass wir mit vielen Debuggern und dergleichen äquivalente Assemblys aus C++-Code dumpen können.

Aber was ist mit Binärcode? Die Formatierung der Bits in jedem Byte, aus denen die eigentlichen Maschinenanweisungen bestehen, die wiederum die Mikroprogramme bilden (falls die Mikroarchitektur eines hat).

Wenn jede Zeile C++-Code auf irgendeine Weise und an einem bestimmten Punkt im Programm in Maschinencode umgewandelt werden MUSS (z. B. kann ein Float in C++ definiert sein, hat aber keinen Nutzen, bis er auf den Stapel geschoben wird, sodass er möglicherweise nicht 1:1 Zeile für Zeile in den gesamten Maschinencode umgewandelt wird, aber trotzdem verwendet wird), kann jede Anweisung usw. verfolgt werden. Debugger geben jedoch nicht die Bildung der Bits aus, die jede einzelne Anweisung belegen.

Wenn jedes Programm formatierte Byte-/Bitmusteranweisungen für die CPU erhält, muss es (nehme ich an) möglich sein, den gesamten von Ihnen geschriebenen Code auf die tatsächlichen Bits auf Schaltungsebene zurückzuführen.

Aber um Ihnen die größtmögliche Sicherheit zu geben,Ist es möglichum dies in dem Umfang zu tun, wie ich es hier beschreibe? Moderne Debugger/Software bieten diese Funktion nicht, und selbst diejenigen, die sie bieten, scheinen dem Entwickler nicht die gesamte Binärdarstellung jeder Anweisung klar zu vermitteln.

PS: Dies setzt natürlich voraus, dass der kompilierte Code mit Anweisungen für die vorgesehene Architektur problemlos ausführbar ist (und nicht eine interpretierte Sprache oder ein Bytecode ist, für dessen Übersetzung ein anderes Programm erforderlich ist).

Antwort1

Sie können einen Disassembler verwenden, um kompilierten Binärcode wieder in Assemblersprache umzuwandeln. Dadurch können Sie (mit Schwierigkeiten) nur in Binärform verteilte Software „lesen“.

Zum anderen Teil Ihrer Frage: Sie scheinen eine Art Hardware-Dekompiler zu wollen, der detailliertere Informationen darüber liefert, wie die CPU einen bestimmten Binärbefehl ausführt. Ich kenne kein Tool dafür. Sie müssen wahrscheinlich die Hardwarehandbücher lesen und diese Art der Analyse im Kopf durchführen.

Antwort2

NEIN.

Nun, vielleicht, aber es gibt keine Garantie, denn der Code, der in den Compiler geht, ist selten der gleiche wie der Code, der herauskommt, und zwar aus zwei Gründen: Menschen sind schrecklich darin, effizienten Code zu schreiben, und Menschen denken nicht so über Code nach, wie ihn eine CPU verarbeiten muss. Aus diesem Grund optimieren Compiler den Quellcode, bevor sie ihn in Assembler/Binärcode konvertieren. Dies kann dazu führen,Anweisungen werden neu angeordnet, unnötige Anweisungen werden entfernt und ganze Funktionen werden eingefügt.

Nehmen wir beispielsweise den folgenden Pseudocode:

int x = 3;
x = 3*3;
x = 4;
function mult4(number) { return number * 4; }
x = mult4(x);

kann vollständig reduziert werden auf

int x = 16;

durch einen guten optimierenden Compiler, der überhaupt nicht mit dem Quellcode übereinstimmt. Aus diesem Grund müssen Sie beim Debuggen häufig Compileroptimierungen deaktivieren. Wenn alle Compileroptimierungen deaktiviert sind, versucht der Compiler, eine Assembly auszugeben, die 1:1 mit dem Quellcode übereinstimmt.

verwandte Informationen